java - 使用mockito初始化spring batch jobExecution

标签 java spring spring-batch

问题:

我正在为我的一种 Spring 批量工作方法编写单元测试。我使用mockito 来模拟我的批处理作业依赖项。在 jobExecution 发挥作用之前一切都很好。我想要测试的方法调用了 jobExecution 变量,但随后它给了我 NPE (NullPointerException),并且我没有成功地用 mockito 来模拟它。

<小时/>

我尝试过的事情:

就像问题部分提到的那样,我尝试使用 @Mock 注释来模拟它。

<小时/>

代码:

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

    @Override
    public List<Date> getValidDates() {
        List<Date> allDates = dateService.findAllFailedDates(getJobName(), false);
        List<Date> datesThatCanBeWorkedOn = getAllDatesThatHaveNecessaryDependencies(allDates);
        Collection<Date> datesThatCannotBeWorkedOn = CollectionUtils.subtract(allDates, datesThatCanBeWorkedOn);
        currentJobExecution.getExecutionContext().put("datesThatCannotBeWorkedOn", datesThatCannotBeWorkedOn);
        return datesThatCanBeWorkedOn;
    }

我的单元测试尝试测试上面的代码:

@RunWith(SpringJUnit4ClassRunner.class)
public class ValidDateReaderTest extends BaseTest {

    @InjectMocks
    private ValidDateReader validDateReader;

    @Mock
    private DateService dateService;

    @Mock
    private JobExecution currentJobExecution;

    @Mock
    private JobInstance jobInstance;

    @Test
    public void getDatesNeededProcessingTest() {

        when(jobInstance.getJobName()).thenReturn(BatchNames.VALID_DATE_READER);
        when(currentJobExecution.getJobInstance()).thenReturn(jobInstance);
        List<Date> allDates = new ArrayList<>();
        allDates.add(DateUtils.addDays(new Date(), -5));
        allDates.add(DateUtils.addDays(new Date(), -4));
        allDates.add(DateUtils.addDays(new Date(), -3));
        allDates.add(DateUtils.addDays(new Date(), -2));
        allDates.add(DateUtils.addDays(new Date(), -1));
        when(dateService.findAllFailedDates(BatchNames.VALID_DATE_READER, false))
                .thenReturn(allDates);
        assertEquals(1, validDateReader.getValidDates().size());
    }

}
<小时/>

预期结果和实际结果:

当我删除此 currentJobExecution

currentJobExecution.getExecutionContext().put("datesThatCannotBeWorkedOn", datesThatCannotBeWorkedOn);

从我想要测试的方法,然后测试成功完成。但我无法删除它,因为它是业务逻辑的一部分。

最佳答案

似乎currentJobExecution.getExecutionContext()正在返回null。您可能也想 mock 它:

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

关于java - 使用mockito初始化spring batch jobExecution,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58409384/

相关文章:

azure - 在 Azure 中部署 Spring 批处理的最佳解决方案是什么?

java - 如何为任何对象创建 JobParametersBuilder?

java - Seam 管理的事务操作指南

java - 在Java中,您可以以参数化的方式使用getter和setter,即传递代码来决定返回哪个类变量

java - 如何在 Spring AOP 上获取 Web session

Spring Data 与 QueryDslPredicateExecutor 没有找到类型错误的属性 findAll

java - 使用 Maven 将 Spring 框架应用程序打包到 war

java - 检索 servlet 外部的 Init 参数

java - 如何将某物实例的名称设置为整数值?

java - 创建名为 'batchPropertyPostProcessor' 的 bean 时,批处理作业初始化因错误而失败