首页 > 解决方案 > 使用 Junit 和 Mockito 的 Google Guice

问题描述

我如何用 Mockito 注入 EntityManager(jpa)?

我想将 Mockito.spy(UserService.class) 绑定到 guice 注入器。但 UserService.class 有 EntityManager 用于查询执行。

在 guice 注入器中安装“JunitServiceModule”时,找不到 EntityManager。

错误详情见下文

com.google.inject.CreationException: Unable to create injector, see the following errors:

1) Error in custom provider, java.lang.NullPointerException
  while locating com.google.inject.persist.jpa.JpaPersistService
  while locating javax.persistence.EntityManager

我的代码如下。(测试代码只是让错误情况类似。)(实际上'EntityManager'位于UserRepository...只是示例!)(@Transactional属于guice)

public class UserServiceTest {
    @Inject
    private UserService userService;
    
    @Before
    public void setUp() {
        Injector injector = new TestBuilder().init();
        injector.initMembers(this);
        Mockito.doReturn(10).when(userService).getEntityCount(UserEntity.class);
    }
    
    @Test
    public void test() {
        assertEquals(10, userService.getEntityCount(UserEntity.class));
    }
}


public class TestBuilder {

    public TestBuilder() {
    }

    public Injector init() {
        Injector injector = Guice.createInjector(
            new TestDBInjectModule("test"),
            new JunitServiceModule()
        );
    }
}


public class TestDBInjectModule extends AbstractModule {
    private String unitName;

    public TestDBInjectModule(String unitName) {
        this.unitName = unitName;
    }

    @Override
    protected void configure() {
        install(new JpaPersistModule(unitName));
        bind(JpaInitializer.class).asEagerSingleton();
    }

    @Singleton
    private static class JpaInitializer {
        @Inject
        public JpaInitializer(final PersistService persistService) {
            persistService.start();
        }
    }
}

public class JunitServiceModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(UserService.class).toInstance(Mockito.spy(UserService.class));
    }
}


public class UserService {
  @Inject
  private EntityManager entityManager;

  public UserService {} // <-- throw NullPointerException!!! since EntityManager

  @Transactional
  public void addUser(User user) {
    return entityManager.persist(user);
  }

  public Number getCount() {
    return entityManager.createQuery("select count(*) from user", Number.class).getSingleResult();
  }
}

标签: javajpajunitmockitoguice

解决方案


推荐阅读