Spring Batch Java Config JobLauncherTestUtils

Posted

技术标签:

【中文标题】Spring Batch Java Config JobLauncherTestUtils【英文标题】: 【发布时间】:2017-07-28 10:29:27 【问题描述】:

我目前正在开发一个使用 Spring Batch 的 Spring Boot 项目。我正在尝试使用 JavaConfig 而不是 xml,但是对于当前在 xml 中的所有文档来说,这很困难。

我关注了https://blog.codecentric.de/en/2013/06/spring-batch-2-2-javaconfig-part-5-modular-configurations,但在使用JobLauncherTestUtils 时遇到了困难。我知道我需要告诉测试使用正确的弹簧上下文,但我似乎不知道该怎么做。我收到以下错误:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.batch.test.JobLauncherTestUtils' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: @org.springframework.beans.factory.annotation.Autowired(required=true)

我的测试如下所示:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MyApplication.class, MyJobConfiguration.class)
public class RetrieveDividendsTest 

    @Autowired
    private JobLauncherTestUtils jobLauncherTestUtils;

    @Test
    public void testSomething() throws Exception 
        jobLauncherTestUtils.launchJob();
    


【问题讨论】:

您是否尝试过向测试类添加 TestExecutionListener 注释以注入配置的应用程序上下文? @TestExecutionListeners( DependencyInjectionTestExecutionListener.class, ) 看看docs.spring.io/spring-batch/reference/html/…,看看那里是如何测试作业以及如何测试单个步骤的。 @Sander_M 但要做到这一点,我需要让JobLauncherTestUtils 工作,这是我的问题。我正在尝试进行端到端或单独的步骤测试,而不仅仅是测试组件。 【参考方案1】:

你的 pom.xml 中有以下内容吗?

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-batch</artifactId>
</dependency>

如果我没记错的话,你使用的是 spring boot,它应该为你加载 spring batch 的自动配置 bean,以便它们可以被注入。

【讨论】:

是的,我有依赖。代码编译无法正确获取上下文。 Spring boot 使用以下模式在测试环境中查找您的配置:1) 在您的测试包中搜索最接近的@SpringBootApplication。 2)在你的主包中搜索最近的@SpringBootApplication。你有这些吗?如果没有,您可以在您的测试包中创建一个带有@ComponentScan 的测试包,用于搜索您的@Configuration 文件。【参考方案2】:

我偶然发现了同样的问题,并查看了 Spring Batch 示例中的 this XML configuration。基于此,我设法让它工作:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes =  BatchTest.BatchTestConfig.class )
public class BatchTest 

    @Autowired
    private JobLauncherTestUtils jobLauncherTestUtils;

    @Test
    public void demo() throws Exception 
        JobExecution jobExecution = jobLauncherTestUtils.launchJob();

        Assert.assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus());
    

    @Configuration
    @EnableBatchProcessing
    static class BatchTestConfig 

        @Bean
        JobLauncherTestUtils jobLauncherTestUtils() 
            return new JobLauncherTestUtils();
        

        // rest omitted for brevity
    

测试成功,我的ItemWriter 按预期记录处理的元素。

【讨论】:

由于某种原因,在我将 BatchTestConfig 移动/升级到它自己的类之前,我得到“没有可用的 'org.springframework.batch.core.Job' 类型的合格 bean”。我从未遇到过的 Spring 怪癖或我不知道的错误...否则 +1 我有同样的错误,即使在将 BatchTestConfig 移动到它自己的类之后。获取Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.batch.core.Job' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: @NicolasWidart // rest omitted for brevity 部分包含一个 Job bean 的定义:@Bean public Job myJob(JobCompletionNotificationListener listener) ... 。在我看来,您没有正确配置 Spring Batch 管道。 哦,我明白了,但是我将在其配置文件中复制已完成的作业配置? @NicolasWidart 您可以在测试上下文中加载非测试配置并从那里使用配置的 bean 吗?请注意特定类型的重复 bean(即,您确实需要两次,因为您可能需要更改测试环境的某些配置步骤)。【参考方案3】:

对于 spring Batch 4.1.x 或以上版本我们可以使用 @SpringBatchTest 自动注入 jobLauncherTestUtils 的注解,查看示例以获取更多详细信息 Here

如果您无法升级到 4.1.x 或更高版本,您可以这样创建

@Bean
     public JobLauncherTestUtils getJobLauncherTestUtils()

            return new JobLauncherTestUtils() 
                @Override
                @Autowired
                public void setJob(@Qualifier("myjobname") Job job) 
                    super.setJob(job);
                
            ;
          

【讨论】:

以上是关于Spring Batch Java Config JobLauncherTestUtils的主要内容,如果未能解决你的问题,请参考以下文章

重试不使用带有 Java Config 的 Spring Batch

Spring Batch Test - 无法自动装配。找不到“JobLauncherTestUtils”类型的 bean

Java spring boot + spring batch:处理大量信息

spring batch(二):核心部分:配置Spring batch

Java Spring Batch:如何验证执行是并行完成的?

Java Spring Batch StoredProcedureItemReader 实现(SYSBASE IQ)