Quartz scheduler 通过guice对模拟对象(使用Mockito)进行验证

Quartz scheduler 通过guice对模拟对象(使用Mockito)进行验证,quartz-scheduler,guice,testng,mockito,Quartz Scheduler,Guice,Testng,Mockito,我有单元测试,我使用GUI进行di,我用以下注释我的类: @Guice(模块={BatchGuiceModule4Test.class}) 公共类TestOneDayBatchStarter{ } 我的对象很好地从我的模块中注入,如下所示: @Inject 专用数据管理器数据管理器; 在我的模块中,我添加了@Provides方法: @提供 @独生子女 公共数据管理器getDataManager(){ 调试(“##初始化模拟数据管理器”); DataManager=mock(DataManag

我有单元测试,我使用GUI进行di,我用以下注释我的类:

@Guice(模块={BatchGuiceModule4Test.class})
公共类TestOneDayBatchStarter{
}
我的对象很好地从我的模块中注入,如下所示:

@Inject
专用数据管理器数据管理器;
在我的模块中,我添加了@Provides方法:

@提供
@独生子女
公共数据管理器getDataManager(){
调试(“##初始化模拟数据管理器”);
DataManager=mock(DataManager.class);
当(dataManager.getObjectCodeList())。然后返回(getOcList());
....
返回数据管理器;
}
在我的测试中,我调用了一个方法,该方法调用了一个特定的方法,我想验证它:

@测试
public void testDefaultJob(){
JobDetail JobDetail=newJob()。类型(OneDayBatchStarter.class)
.withIdentity(每日\u默认\u作业、调度程序.DEFAULT\u组).build();
试一试{
scheduleJob(jobDetail,TriggerBuilder.newTrigger().startNow().build());
}捕获(调度){
LOG.warn(“调度期间出错”,e);
}
验证(dataManager).getObjectCodeList();
}
我添加了一些跟踪,我看到模拟对象实际上被称为:

"## init Mocked Data Manager "

但我在验证时出错:

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验证

这应该行得通,您是否调试了代码?Guice应该调用您的提供程序来获取DataManager的实例。如果没有,它是如何被实例化的?在那里放一个断点并找出答案。

PEBKAC问题,Guice和Mockito工作得很好,只是我用quartz启动了作业,所以quartz用一个新线程启动了作业。不用等待,我检查我的模拟对象是否已经被调用,这样我的问题就解决了

所以我用这个改变了我的测试方法

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

Guice call my@提供了方法,因为我在sys中看到了我的记录器跟踪:“##init mock Data Manager”和“call object code list…”。我想可能是因为guice返回的是一个代理对象,而不是真实的实例,我会添加跟踪来检查它是否是完全相同的对象。也许最好在不涉及Quartz的情况下测试你的东西,不是吗?
@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();
}