Spring boot 使用@SpringApplicationConfiguration:使用SpringBatch和SpringBoot时如何在测试中设置jobparameters

Spring boot 使用@SpringApplicationConfiguration:使用SpringBatch和SpringBoot时如何在测试中设置jobparameters,spring-boot,spring-batch,Spring Boot,Spring Batch,当使用纯spring引导和spring批处理时,有没有办法在集成测试中定义jobparameters 当我在Spring Boot中定义一个简单的批处理作业并用SpringApplication.run(args)启动它时,我可以在run方法中传递我的程序参数 因为我激活了Spring引导批处理,所以这些参数被转换成JobParameters,然后被传递到作业。这发生在类JobLauncherCommandLineRunner中 之后,我可以通过jobexecution对象读取此jobparam

当使用纯spring引导和spring批处理时,有没有办法在集成测试中定义jobparameters

当我在Spring Boot中定义一个简单的批处理作业并用
SpringApplication.run(args)
启动它时,我可以在run方法中传递我的程序参数

因为我激活了Spring引导批处理,所以这些参数被转换成
JobParameters
,然后被传递到作业。这发生在类
JobLauncherCommandLineRunner

之后,我可以通过jobexecution对象读取此jobparameters

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

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {MyBatchRootConfiguration.class})
@IntegrationTest({"aProp=aValue"})
public class MyBatchTestClass {
   @Test
   public void launchTest() {
   }
}
注意:
MyBatchRootConfiguration
定义了作业,还添加了
@SpringBootApplication
@EnableBatchProcessing

我现在面临的问题是:如何传递将转换为jobparameters的参数?有没有办法,如何做到这一点

就我所见,
@SpringApplicationConfiguration
将加载程序定义为“SpringApplicationContextLoader”。因此,将
@SpringApplicationConfiguration
添加到测试类最终会调用方法
SpringApplicationContextLoader.loadContext(…)
。在该方法中,将创建SpringContext,并创建
SpringApplication
的实例。最后,在SpringApplicationContextLoader.loadContext()的下一行中(第103行表示SpringBoot的1.2.4版本)

跑步叫跑步

但与spring boot批处理的示例相反

它最终也调用了SpringApplication的非静态运行方法,无法传递或定义
args

但这对于spring批处理至关重要,因为这些
arg
JobLauncherCommandLineRunner
中转换为
JobParameters

SpringApplication.run(String…args)
调用
SpringApplication.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
,但是如果我想进行一个测试,它会以“spring引导方式”启动一个作业呢
@SpringApplicationConfiguration
正是为了实现这一点

但是,如果我们喜欢使用它来启动Spring批处理作业,那么在我看来,我们似乎缺少了一种定义程序参数的方法,因此无法定义作业参数

这使我得出结论,如果作业依赖于作业参数,则不能使用
@SpringApplicationConfiguration
测试作业

有什么想法或解决方案吗

谢谢


Hansjoerg

你是如何在考试中开始你的工作的?我编辑了我的原始帖子,以澄清我的意图。我知道,我可以使用JobLauncherTestUtils启动一个未经测试的作业。但是如果我想使用@SpringApplicationConfiguration来测试作业呢?现在有一种方法可以传递程序参数,从而传递jobparameters.1。什么是
@SpringApplicationContext
?我知道(并且看到您正在尝试使用)
@SpringApplicationConfiguration
,但我不熟悉前者。2.
@SpringApplicationContext
只是引导一个上下文。它没有添加启动功能。你真正想要的是一种测试Spring框架的方法,而我所知道的唯一的方法就是使用类似Process.exec的东西。对不起,我赶时间。我的意思是
@SpringApplicationConfiguration
而不是
@SpringApplicationContext
。此外,我对
@MyBatchRootConfiguration
的定义不准确,其中包含作业定义,以及“@SpringBootApplication
@EnableBatchProcessing”,“@ComponentScan”;基本上,这定义了整个启动过程。我再次编辑了我的问题,以便更准确。我的问题是一样的:在编写带有
@SpringApplicationConfiguration
注释的测试时,如何定义作业参数?启动作业“引导方式”的确切含义是什么?Spring Boot仍然使用一个
JobLauncher
,您可以自己将它注入到测试中
@IntegrationTest
设置环境变量,不传递应用程序参数。我想我是想知道你丢了什么?将参数转换为
JobParameter
实例?如果是这种情况,您可以将
JobLauncherCommandLineRunner
注入到测试中,并直接调用它。
@SpringBootApplication
public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}
@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);
   }
}