java - 使用 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();
}
}
解决方案
推荐阅读
- angular - 如何从应用模块中导入的模块访问组件?
- python - TensorBoard 未启动任何图表
- c# - 从 Windows 服务启动进程
- c# - 从 CSV 文件解析字符串,与字符串数组进行比较以打印特定行
- java - Eclipse 插件的自动安装依赖项
- sql - 如何替换动态光标以获得更好的性能?
- php - 在 yii2 activeform 中上传图片
- azure - 将证书导入 Azure Key Vault:密钥在指定状态下无效
- scala - Scala:需要有关从文件中获取属性的更好方法的建议
- kubernetes - Airflow/k8s:如何正确设置存储在持久卷中的 DAG 的权限?