Spring Batch 5中JobConfiguration类的JUnit测试实现及PlatformTransactionManager模拟方法咨询
Spring Batch 5中JobConfiguration类的JUnit测试实现及PlatformTransactionManager模拟方法咨询
没问题!我来帮你搞定这个JUnit测试的写法,尤其是PlatformTransactionManager的模拟~
首先先把你提供的配置类再清晰展示下:
package com.example.demo; import org.springframework.batch.core.Job; import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.PlatformTransactionManager; @Configuration public class JobConfiguration { @Bean public Job job(JobRepository jobRepository, PlatformTransactionManager transactionManager) { return new JobBuilder("job", jobRepository) .start(new StepBuilder("step", jobRepository) .tasklet((contribution, chunkContext) -> { System.out.println("hello world"); return RepeatStatus.FINISHED; }, transactionManager) .build()) .build(); } }
接下来给你两种常用的测试方案,按需选择:
方案一:纯单元测试(不加载Spring上下文)
这种方式适合快速验证配置类的Bean创建逻辑,用Mockito来模拟依赖:
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.batch.core.Job; import org.springframework.batch.core.repository.JobRepository; import org.springframework.transaction.PlatformTransactionManager; import static org.junit.jupiter.api.Assertions.assertNotNull; @ExtendWith(MockitoExtension.class) public class JobConfigurationTest { // 用@Mock自动模拟这两个依赖对象 @Mock private JobRepository jobRepository; @Mock private PlatformTransactionManager transactionManager; @Test void testJobBeanCreation() { // 直接实例化配置类,调用方法创建Job JobConfiguration config = new JobConfiguration(); Job job = config.job(jobRepository, transactionManager); // 验证Job是否成功创建 assertNotNull(job, "Job Bean应该能正常创建"); // 如果需要,还可以进一步验证Job的名称、步骤数量等细节 } }
方案二:集成测试(加载Spring上下文)
如果需要验证Spring上下文能否正确加载并注入Bean,可以用Spring Boot Test配合@MockBean:
import org.junit.jupiter.api.Test; import org.springframework.batch.core.Job; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.batch.core.repository.JobRepository; import org.springframework.transaction.PlatformTransactionManager; import static org.junit.jupiter.api.Assertions.assertNotNull; // 指定加载你的配置类 @SpringBootTest(classes = JobConfiguration.class) public class JobConfigurationIntegrationTest { // 用@MockBean把模拟对象注入到Spring上下文 @MockBean private JobRepository jobRepository; @MockBean private PlatformTransactionManager transactionManager; // 自动注入Spring创建好的Job Bean @Autowired private Job job; @Test void testJobAutowiredSuccessfully() { assertNotNull(job, "Job应该能被Spring上下文正常注入"); } }
额外优化建议:单独测试Tasklet逻辑
如果想验证tasklet里的业务逻辑(比如是否真的打印了"hello world"),建议把tasklet抽成独立的Bean,这样测试起来更方便:
先修改你的JobConfiguration:
package com.example.demo; import org.springframework.batch.core.Job; import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.PlatformTransactionManager; @Configuration public class JobConfiguration { @Bean public Tasklet helloWorldTasklet() { return (contribution, chunkContext) -> { System.out.println("hello world"); return RepeatStatus.FINISHED; }; } @Bean public Job job(JobRepository jobRepository, PlatformTransactionManager transactionManager, Tasklet helloWorldTasklet) { return new JobBuilder("job", jobRepository) .start(new StepBuilder("step", jobRepository) .tasklet(helloWorldTasklet, transactionManager) .build()) .build(); } }
然后单独写Tasklet的测试类:
import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.repeat.RepeatStatus; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; public class HelloWorldTaskletTest { @Test void testTaskletExecution() throws Exception { // 捕获System.out的输出,验证是否打印了指定内容 ByteArrayOutputStream outContent = new ByteArrayOutputStream(); System.setOut(new PrintStream(outContent)); // 创建tasklet并执行 Tasklet tasklet = new JobConfiguration().helloWorldTasklet(); RepeatStatus status = tasklet.execute(null, Mockito.mock(ChunkContext.class)); // 验证返回状态和输出内容 assertEquals(RepeatStatus.FINISHED, status); assertTrue(outContent.toString().contains("hello world")); // 恢复原有的System.out System.setOut(System.out); } }
备注:内容来源于stack exchange,提问作者hanene
相关产品推荐
相关产品推荐

