当前位置: 首页 > 知识库问答 >
问题:

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

卫景明
2023-03-14

问题:

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

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

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

共有1个答案

年风华
2023-03-14

CurrentJobExecution.GetExecutionContext()似乎返回NULL。你可能也想嘲弄一下:

when(currentJobExecution.getExecutionContext()).thenReturn(new ExecutionContext());
 类似资料:
  • 在Spring中,可以将bean配置为懒洋洋地初始化。Spring批处理作业也是(Spring管理的)bean。也就是说,当我配置类似于

  • 我的spring批处理应用程序运行在连接到MySQL数据库(单实例)的PCF平台上,只有一个实例启动时运行良好

  • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。

  • 我有一个Spring批处理工作,分两步。第一个下载文件,第二个处理文件。问题是,在第一步运行之前,第二步不知道文件的名称。 作业已自动实例化这些步骤,以便在需要时运行。我想不出任何方法来确保第一步运行后该步骤会初始化。 以下是代码: 你可以看到获取我在第一步的Tasklet中设置的局部变量。

  • 我试图在JUnit 5和SpringBatchTest注释中加载JobLauncherTestUtils对象。但是,它无法加载应用程序上下文。所有其他自动构建的bean都成功加载,但是JobLauncherTestUtils无法加载。这是我的测试配置,省略了导入。我尝试在BeforeAll中手动加载它,但是JobRepository和JobLauncher无法加载。我只对能够成功实例化JobLau

  • 我已经使用开始我的作业,当我尝试使用另一个请求停止作业时,然后获取exeption: JobExecutionNotrunningException:JobExecution必须正在运行,才能停止 当打印作业状态总是获取但批处理作业正在运行时 它的web应用程序,首先上传一些CSV文件,并使用spring batch启动一些操作,在执行过程中,如果用户需要停止,则从另一个控制器方法来停止请求,并试