Java 使用mockito初始化spring批处理作业执行

Java 使用mockito初始化spring批处理作业执行,java,spring,spring-batch,Java,Spring,Spring Batch,问题: 我正在为我的一个spring批处理作业方法编写单元测试。我使用mockito来模拟批处理作业的依赖关系。在作业执行开始之前,一切都很好。我想测试的方法调用了jobExecution变量,但是它给了我NPE(NullPointerException),我没有成功地用mockito模拟它 我尝试过的事情: 就像问题部分提到的,我试图用@mock注释来模拟它 代码: 我的方法需要进行单元测试(currentJobExecution是给出错误的行): @覆盖 公共列表getValidDate

问题:

我正在为我的一个spring批处理作业方法编写单元测试。我使用mockito来模拟批处理作业的依赖关系。在作业执行开始之前,一切都很好。我想测试的方法调用了jobExecution变量,但是它给了我NPE(NullPointerException),我没有成功地用mockito模拟它


我尝试过的事情:

就像问题部分提到的,我试图用@mock注释来模拟它


代码:

我的方法需要进行单元测试(currentJobExecution是给出错误的行):

@覆盖
公共列表getValidDates(){
List allDates=dateService.findAllFailedDates(getJobName(),false);
List DATESTATCANBEWORKEDON=GetAllDatesTATHATHAVENECCESSARYDependencies(所有日期);
Collection datesthattcannotbeworkedon=CollectionUtils.subtract(allDates,datesthattcanbeworkedon);
currentJobExecution.getExecutionContext().put(“datesThatCannotBeWorkedOn”,datesThatCannotBeWorkedOn);
可处理的返回日期;
}
尝试测试上述代码的我的单元测试:

@RunWith(SpringJUnit4ClassRunner.class)
公共类ValidDataReaderTest扩展了BaseTest{
@注射模拟
私人ValidDataReader ValidDataReader;
@嘲弄
私人数据服务;
@嘲弄
私有作业执行currentjobsecution;
@嘲弄
私有JobInstance JobInstance;
@试验
public void GetDatesNeeddProcessingTest(){
when(jobInstance.getJobName()).thenReturn(BatchNames.VALID\u DATE\u READER);
当(currentJobExecution.getJobInstance())。然后返回(jobInstance);
List allDates=new ArrayList();
add(DateUtils.addDays(new Date(),-5));
add(DateUtils.addDays(new Date(),-4));
add(DateUtils.addDays(new Date(),-3));
add(DateUtils.addDays(new Date(),-2));
add(DateUtils.addDays(new Date(),-1));
when(dateService.findAllFailedDates(BatchNames.VALID\u DATE\u READER,false))
.然后返回(所有日期);
assertEquals(1,validDataReader.getValidDates().size());
}
}

预期结果和实际结果:

当我删除此currentJobExecution时

currentJobExecution.getExecutionContext().put(“datesThatCannotBeWorkedOn”,datesThatCannotBeWorkedOn);

根据我想要测试的方法,测试就成功完成了。但是我不能删除它,因为它是业务逻辑的一部分。

在测试逻辑之前调用它(例如,在
@before
方法中):


如果不需要Spring上下文,也可以将单元测试运行程序更改为
@RunWith(MockitoJUnitRunner.class)

在测试逻辑之前调用它(例如,在
@before
方法中):


如果不需要Spring上下文,也可以将单元测试运行程序更改为
@RunWith(MockitoJUnitRunner.class)

看起来像
currentJobExecution.getExecutionContext()
正在返回
null
。你可能也想嘲笑它:

when(currentJobExecution.getExecutionContext()).thenReturn(new ExecutionContext());

似乎
currentJobExecution.getExecutionContext()
正在返回
null
。你可能也想嘲笑它:

when(currentJobExecution.getExecutionContext()).thenReturn(new ExecutionContext());

当然,它会因一个
NullPointerException
而失败。没有为
currentJobExecution.getExecutionContext()
注册的行为,因此Mockito执行默认操作,即返回
null
。在你的设置中,你需要另一个
when
子句。我按照@Spac Valentin的建议做了。好像和你说的一样。谢谢您的回答。当然,它会失败,出现
NullPointerException
。没有为
currentJobExecution.getExecutionContext()
注册的行为,因此Mockito执行默认操作,即返回
null
。在你的设置中,你需要另一个
when
子句。我按照@Spac Valentin的建议做了。好像和你说的一样。谢谢你的回答,谢谢。这解决了我的问题。我接受了这个答案,谢谢。这解决了我的问题。我接受了这个答案。我按照@Spac Valentin的建议做了。但还是要感谢你的努力和建议。我按照@Spac瓦伦丁的建议做了。但还是要感谢你的努力和建议。