You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:57:57