Spring boot 使用@SpringApplicationConfiguration:使用SpringBatch和SpringBoot时如何在测试中设置jobparameters
当使用纯spring引导和spring批处理时,有没有办法在集成测试中定义jobparameters 当我在Spring Boot中定义一个简单的批处理作业并用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
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);
}
}