测试弹簧批处理作业stepScope

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了测试弹簧批处理作业stepScope相关的知识,希望对你有一定的参考价值。

我正在尝试测试执行读取(从另一个应用程序获取数据)进程(简单计算)和写入(进入mongodb)的Spring批处理作业

读者是@StepScope

这是读取任务的postConstruct。

 @PostConstruct
    public void init(){
        employees.addAll(getListOfEmployeesBy(affectationMotifService.findAllRegistrationNumbers()));
    }

    public List<EmployeeForSalaryDTO> getListOfEmployeesBy(List<String> registrationNumbers){
        LOG.debug("request to get all the employees by registration numbers {}" , registrationNumbers);
        return coreResourceFeign.getAllEmployeesForSalaryByRegistrationNumbers(registrationNumbers).getBody();
    }

当我尝试启动作业测试或在应用程序中测试的内容时。 spring始终运行读取任务的init()..这将使测试失败,因为我需要模拟coreResourceFeign.getAllEmployeesForSalaryByRegistrationNumbers(registrationNumbers)。我无法模拟该方法,因为它在测试开始之前运行。

这是测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {SalaryApp.class, SecurityBeanOverrideConfiguration.class})
public class SalaryJobServiceTest {
    @Autowired
    @InjectMocks
    private SalaryJobService salaryJobService;

    @Test
    public void startJob() throws Exception {
        SalaryJobDTO SalaryJobDTO = salaryJobService.start(Collections.emptyList());
        Assert.assertNotNull(salaryJobDTO.getId());
    }
}

我不知道如何处理弹簧批量测试。任何建议或帮助都将受到欢迎。

答案

@PostConstruct将确保在创建对象后立即调用您的方法。应用程序启动时,Spring应用程序根据配置创建所有bean。这是预期的行为。如果您不想在应用程序启动期间调用您的方法,请删除@PostConstruct,您可以运行测试模拟依赖对象。

相反,您应该使用读取器读取方法将数据加载到读取器。

以上是关于测试弹簧批处理作业stepScope的主要内容,如果未能解决你的问题,请参考以下文章

如何测试从数据库读取并写入文件的弹簧批处理步骤?

当从控制器启动的作业失败时,如何防止弹簧批处理关闭应用程序?

运行弹簧批处理作业的多个实例时出现死锁

尝试传递参数时,Spring批处理中的@StepScope抛出异常

如何使用弹簧批处理集成从远程服务器(主服务器)在工作服务器的多个节点上运行/执行作业?

Spring Batch StepScope Bean