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