首页 > 解决方案 > 我无法使用 mockito 替换 SpringBatch 中的方法调用

问题描述

我正在尝试使用 mockito 替换 SpringBatch 中的方法调用。代码大大简化并删除了不必要的减少它,如果缺少什么,写,我会补充。

Spring批处理设置文件

@Configuration
@EnableBatchProcessing
public class ListBatchConfig {
    @Bean
    public Job jobListBath(JobBuilderFactory jobBuilderFactory,
                            StepBuilderFactory stepBuilderFactory,
                            ItemReader<Student> itemReaderListBath,
                            ItemProcessor<Student, Marksheet> processorListBath,
                            ItemWriter<Marksheet> itemWriterListBath
    ) {
    Step step = stepBuilderFactory.get("List-load")
        .<Student, Marksheet>chunk(3)
        .reader(itemReaderListBath)
        .processor(processorListBath)
        .writer(itemWriterListBath)
        .build();
    return jobBuilderFactory.get("L-Load")
        .incrementer(new RunIdIncrementer())
        .start(step)
        .build();
    }
    @Bean
    public ItemReader<Emaill> itemReaderListBath() {
    return new ListItemReader();
    }
...

ItemReader 在一个单独的类 List Item Reader 中描述

@Component
@Slf4j
public class ListItemReader implements ItemReader<Student> {
    @Autowired
    private CalService calService ;
    DataAtributes dataAtributes;
    ...
    @Override
    public Student read() {
    //Тут вызывается метод сервиса, который необходимо подменить
    dataAtributes = new DataAtributes(1,"test");
    Integer val = calService.addAttr(dataAtributes);
    ...  
    }

这是服务本身

@Service
public class CalService {
    public int addI(int input1) {
    return 0;
    }
    public Integer addAttr(DataAtributes attr) {
    return 0;
    }
}

在此服务中,作业开始

@Service
public class StartJob {
    @Autowired
    JobLauncher jobLauncher;
    @Autowired
    Job jobDeveloper;
    public void launchJob() throws Exception {
    ...
    JobExecution jobExecution = jobLauncher.run(jobDeveloper, params);

和测试类本身

@SpringBootTest
public class CaclServisTest {
    @Mock
    CalService calcService;
    @InjectMocks
    StartJob
    @Autowired
    StartJob startJob;

    @Test
    void add() {
    DataAtributes dataAtributes = new DataAtributes(1,"test");
    when(calcService.addAttr(dataAtributes)).thenReturn(57);
    startJob.launchJob();
    }
}

结果,调用的是本机方法,而不是替代方法。我不明白应该安装什么服务@InjectMocks

标签: mockitospring-batch

解决方案


您的@Mock字段在 Spring 上下文中不可用。特别是:从 Spring 上下文中@Autowire StartJob startJob使用CalService,而不是你的模拟。

要在 Spring 上下文中替换 bean,请@MockBean改用:

@SpringBootTest
public class CaclServisTest {
    @MockBean
    CalService calcService;

    @Autowired
    StartJob startJob;

    @Test
    void add() {
    DataAtributes dataAtributes = new DataAtributes(1,"test");
    when(calcService.addAttr(dataAtributes)).thenReturn(57);
    startJob.launchJob();
    }
}

推荐阅读