使用@SpringApplicationConfiguration:如何在使用spring-batch和spring-boot时在测试中设置jobparameters

时间:2015-07-02 10:21:25

标签: spring-boot spring-batch

有没有办法,当我使用带有弹簧批的纯弹簧启动时,如何在集成测试中定义作业参数?

当我在Spring-Boot中定义一个简单的Batch-Job并使用SpringApplication.run(args)启动它时,我可以在run方法中传递我的程序参数。

由于我已激活Spring-Boot-Batch,这些参数将转换为JobParameters,然后传递给作业。这发生在班级JobLauncherCommandLineRunner内。

之后,我可以通过jobexecution对象阅读这个工作参数。

现在,我想编写一个测试,它将以与生产相同的方式开始工作。因此,我正在使用@SpringApplicationConfiguration并编写如下所示的测试:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {MyBatchRootConfiguration.class})
@IntegrationTest({"aProp=aValue"})
public class MyBatchTestClass {
   @Test
   public void launchTest() {
   }
}

注意:MyBatchRootConfiguration定义了作业,并添加了@SpringBootApplication@EnableBatchProcessing等等。

我现在面临的问题:如何传递将转换为作业参数的参数?有办法,怎么办?

据我所知,@SpringApplicationConfiguration将加载器定义为“SpringApplicationContextLoader”。因此,将@SpringApplicationConfiguration添加到测试类最终会调用方法SpringApplicationContextLoader.loadContext(...)。在此方法中,将创建SpringContext,并且还会创建SpringApplication的实例。最后,在SpringApplicationContextLoader.loadContext()的以下行(版本1.2.4的第103行 - spring-boot的RELEASE)

ConfigurableApplicationContext applicationContext = application.run();

运行被调用。

但与https://spring.io/guides/gs/batch-processing/

上的spring-boot-batch示例相反
@SpringBootApplication
public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}

最后还调用了SpringApplication的非静态run方法,无法传递或定义args

但这对于春季批次至关重要,因为这些args会在JobParameters中转换为JobLauncherCommandLineRunner

SpringApplication.run(String ... args)来电SpringAppplication.afterRefresh(..., String[] args)来电SpringApplication.runCommandLineRunners(..., String[] args)来电JobLauncherCommandLineRunner.run(String ... args)

我想除了调整JobLauncherCommandLinerRunner或直接使用它之外别无其他方法,如下例所示:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {MyBatchRootConfiguration.class})
@IntegrationTest({"aProp=aValue"})
public class MyBatchTestClass {

    @Autowired
    private JobLauncherCommandLineRunner runner;

   @Test
   public void launchTest() {
        String[] myArgs = new String[]{"jobParam1=value1"};
        runner.run(myArgs);
   }
}

我知道,我可以使用JobLauncherTestUtils,但是,如果我想进行测试,那会启动一项“弹簧启动方式”的工作呢? @SpringApplicationConfiguration正是为了这个。

但是如果我们喜欢使用它来启动Spring-Batch作业,它会让我觉得我们错过了定义程序参数的方法,因此也无法定义作业参数。

这使我得出结论,如果你的工作取决于工作参数,就不能使用@SpringApplicationConfiguration来测试工作。

有任何想法或解决方案吗?

由于

Hansjoerg

0 个答案:

没有答案