使用验证模拟(与Mockito)对象注入guice

时间:2012-03-12 09:08:59

标签: quartz-scheduler guice testng mockito

我有单元测试,我使用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验证?

2 个答案:

答案 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();
}