我遵循了官方的Spring批处理指南(https://Spring.io/guides/gs/batch-processing/)并成功地完成了该示例。对于同样的工作,我正在尝试创建一个端到端的集成测试。特别是我只使用测试配置。在我的测试中,我定义了所有需要的bean。因此这应该是运行作业所需的唯一配置。这给了很大的灵活性。创建ApplicationContext时测试失败。它抱怨找不到数据源。当我运行实际的应用程序时,由于我使用的是内存中的数据库,spring会自动在数据库中创建数据源和spring批处理相关的表。但当我运行测试时,它不会自动创建数据库。我怎么才能触发spring来做那件事呢?
在我的测试配置中,当我添加显式数据源bean配置时,它创建了数据源,但没有在数据库中创建spring批处理相关表。
下面是测试代码:
@SpringBatchTest
@RunWith(SpringRunner.class)
public class PersonJobTest {
@Autowired
private JobLauncherTestUtils jobLauncherTestUtils;
@Test
public void testPersonJob() throws Exception{
JobExecution jobExecution = jobLauncherTestUtils.launchJob();
assertEquals("COMPLETED", jobExecution.getExitStatus().getExitCode());
}
@Configuration
@EnableBatchProcessing
public static class JobConfig {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
private JdbcTemplate simpleJdbcTemplate;
@Bean
public FlatFileItemReader<Person> reader() {
return new FlatFileItemReaderBuilder<Person>()
.name("personItemReader")
.resource(new ClassPathResource("sample-data.csv"))
.delimited()
.names(new String[]{"firstName", "lastName"})
.fieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
setTargetType(Person.class);
}})
.build();
}
@Bean
public PersonItemProcessor processor() {
return new PersonItemProcessor();
}
@Bean
@Autowired
public JdbcBatchItemWriter<Person> writer(DataSource dataSource) {
return new JdbcBatchItemWriterBuilder<Person>()
.itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
.sql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)")
.dataSource(dataSource)
.build();
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean
public JobCompletionNotificationListener getListener(JdbcTemplate jdbcTemplate){
return new JobCompletionNotificationListener(jdbcTemplate);
}
@Bean
public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
return jobBuilderFactory.get("importUserJob")
.incrementer(new RunIdIncrementer())
.listener(listener)
.flow(step1)
.end()
.build();
}
@Bean
public Step step1(JdbcBatchItemWriter<Person> writer) {
return stepBuilderFactory.get("step1")
.<Person, Person> chunk(10)
.reader(reader())
.processor(processor())
.writer(writer)
.build();
}
}
}
pom.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.intuit.iip.dg.dgworkflow</groupId>
<artifactId>dg-workflow-springbatch-poc</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dg-workflow-springbatch-poc</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
为此,您需要使用@springboottest
注释。而且,您不需要在测试内部复制作业配置。下面是一个通过入门指南的测试:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.test.JobLauncherTestUtils;
import org.springframework.batch.test.context.SpringBatchTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import static org.junit.Assert.assertEquals;
@SpringBatchTest
@SpringBootTest
@RunWith(SpringRunner.class)
public class PersonJobTest {
@Autowired
private JobLauncherTestUtils jobLauncherTestUtils;
@Test
public void testPersonJob() throws Exception{
JobExecution jobExecution = jobLauncherTestUtils.launchJob();
assertEquals("COMPLETED", jobExecution.getExitStatus().getExitCode());
}
}
我不确定我是否能清楚地解释我的情况。请建议您对spring-batch作业测试E2E流是否有其他更好的意见,以及您是否可以对上述方法提供任何清晰的说明,这将是有帮助的。
我最近开始进行groovy测试,以测试使用一个步骤(ItemReader、ItemProcessor、ItemWriter)的spring批处理作业 知道我正在使用h2内存数据库,我已尝试通过单元测试启动作业,但无法验证作业是否已完成: 此外,当我试图调试它时,它不会从一端到另一端,而是在测试完成后在ItemReader中停止。我知道这不是等待工作完成。 有没有办法在工作完成后才完成测试? 非常感
我们正在处理一个Spring批处理项目(Spring Boot1.2.2.Release),要求使用Spring SFTP集成以一定频率轮询从服务器位置读取文件。我们使用java config实现了Spring批处理,并在使用Spring Integration java config的过程中实现了Spring批处理。我找不到描述上述情况的例子。我浏览了各种链接,但看到的主要是XML配置示例。 h
我有下一个spring批处理配置类: 启动应用程序时,我收到下一个异常:
当编写器抛出异常时,我希望能够将步骤和作业状态设置为失败。在做了一些调试和检查Spring批处理源代码后,我注意到配置了一个,它认为是一个致命的异常,因此将作业状态设置为FAILED,所以我将代码包装在我的编写器中的一个try-get中,将包装在中,现在作业和步骤状态设置为FAILED,这是我想要的。我不确定这是否是正确的方法,因为我在任何地方都找不到它的文档,的留档也没有提到它。所以,问题是:这
这是我第一次使用Spring批处理,我有一个例外: 我不知道如何解决这个错误。我使用Java配置来定义作业、步骤、读取器、处理器和写入器: null