我有单元测试,我使用guice for di,我用以下内容注释我的课程:
@Guice(modules = { BatchGuiceModule4Test.class })
public class TestOneDayBatchStarter {
}
我的对象很好地从我的模块中注入,如下所示:
@Inject
private DataManager dataManager;
在我的模块中,我添加了一个@Provides方法:
@Provides
@Singleton
public DataManager getDataManager() {
LOG.debug("## init Mocked Data Manager");
DataManager dataManager = mock(DataManager.class);
when(dataManager.getObjectCodeList()).thenReturn(getOcList());
....
return dataManager;
}
在我的测试中,我调用了一种调用特定方法的方法,我想验证它:
@Test
public void testDefaultJob() {
JobDetail jobDetail = newJob().ofType(OneDayBatchStarter.class)
.withIdentity(DAILY_DEFAULT_JOB, Scheduler.DEFAULT_GROUP).build();
try {
scheduler.scheduleJob(jobDetail, TriggerBuilder.newTrigger().startNow().build());
} catch (SchedulerException e) {
LOG.warn("error during scheduling", e);
}
verify(dataManager).getObjectCodeList();
}
我添加了一些跟踪,我看到模拟对象实际上被称为:
"## init Mocked Data Manager "
和
"Call object code list ....."
但我在验证时出错:
FAILED: testDefaultJob
Wanted but not invoked:
dataManager.getObjectCodeList();
-> at net.test.batch.TestOneDayBatchStarter.testDefaultJob(TestOneDayBatchStarter.java:177)
Actually, there were zero interactions with this mock.
我错过了什么,或者通过Guice无法使用mockito验证?
答案 0 :(得分:1)
这应该有效,您是否通过代码进行调试? Guice应该调用您的提供程序来获取DataManager的实例。如果没有,它是如何实例化的?在那里放一个断点并找出答案。
答案 1 :(得分:1)
PEBKAC问题,Guice和Mockito工作得很好,只是我用石英开始工作,所以石英在一个新的线程中启动工作。没有等待,我检查我的模拟对象是否已被调用,所以我的问题。
所以我用这个
改变我的测试方法@Test
public void testDefaultJob() throws InterruptedException, Exception {
JobDetail jobDetail = newJob().ofType(OneDayBatchStarter.class)
.withIdentity(DAILY_DEFAULT_JOB, Scheduler.DEFAULT_GROUP).build();
scheduler.scheduleJob(jobDetail, TriggerBuilder.newTrigger().startNow().build());
Thread.currentThread().sleep(500);
while (!scheduler.getCurrentlyExecutingJobs().isEmpty()) {
Thread.currentThread().sleep(500);
}
verify(dataManager).getObjectCodeList();
}