如何不运行整个Job 单独测试Spring Batch的单个Step
问题核心诱因
你当前的测试上下文加载了定义完整双Step任务的JobConfig.class,JobLauncherTestUtils默认会绑定上下文中存在的完整Job实例,调用launchStep时不会自动切换到单Step执行模式,所以会跑完整Job的所有Step。
可行解决方案
移除测试上下文的完整Job配置
调整@ContextConfiguration的加载类,仅保留你要测试的目标Step对应的配置类,不要加载整个Job的配置类,这样上下文仅存在目标Step,launchStep会直接执行指定Step:// 调整前 @ContextConfiguration(classes = {JobConfig.class, EmailAndArchiveStepConfig.class, UpdateFactorReserveConfig.class}) // 调整后(仅保留待测试Step的配置) @ContextConfiguration(classes = {EmailAndArchiveStepConfig.class})手动绑定待测试Step(适用于必须加载完整Job配置的场景)
如果业务需要必须加载全部配置,可在测试类中注入目标Step,测试执行前手动给JobLauncherTestUtils指定要测试的Step,优先级高于自动绑定的完整Job:@Autowired private Step emailAndArchiveStep; @BeforeEach void initTestUtils() { jobLauncherTestUtils.setStep(emailAndArchiveStep); }补充缺失的ExecutionContext初始化
你当前测试代码中传入的executionContext没有显式初始化,可能触发异常分支导致执行逻辑异常,建议手动实例化传入:ExecutionContext executionContext = new ExecutionContext(); JobExecution jobExecution = jobLauncherTestUtils.launchStep("Email and Archive", executionContext);优化断言写法
Spring Batch的ExitStatus已经内置COMPLETED静态常量,无需手动实例化:assertEquals(ExitStatus.COMPLETED.getExitCode(), jobExecution.getExitStatus().getExitCode());
完整修正后测试代码示例
@SpringBootTest @SpringBatchTest @EnableAutoConfiguration @ContextConfiguration(classes = {EmailAndArchiveStepConfig.class}) @ExtendWith(SpringExtension.class) @ActiveProfiles("test") class ConfigTest { @Autowired private JobLauncherTestUtils jobLauncherTestUtils; private JdbcTemplate jdbcTemplate; @Autowired public void setDataSource(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } @Test @DisplayName("Testing Email and Archive Configured") public void testEmailAndArchiveConfig(){ ExecutionContext executionContext = new ExecutionContext(); JobExecution jobExecution = jobLauncherTestUtils.launchStep("Email and Archive", executionContext); assertEquals(ExitStatus.COMPLETED.getExitCode(), jobExecution.getExitStatus().getExitCode()); } }
内容的提问来源于stack exchange,提问作者Josh Brooks
相关产品推荐
相关产品推荐

