【发布时间】:2017-01-29 22:22:35
【问题描述】:
我有写入数据库的 Spring Batch 作业(它有一个带有 JpaItemWriter 的步骤)。我有一个集成测试,如下所示:
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("integrationTest")
public class LoadApplicationTests {
@Autowired
private Job job;
@Autowired
private JobRepository jobRepository;
@Autowired
private JobLauncher jobLauncher;
private JobLauncherTestUtils jobLauncherTestUtils;
@Before
public void setUp() throws IOException, java.text.ParseException, Exception {
jobLauncherTestUtils = new JobLauncherTestUtils();
jobLauncherTestUtils.setJob(job);
jobRepository = new MapJobRepositoryFactoryBean(new ResourcelessTransactionManager()).getObject();
jobLauncherTestUtils.setJobRepository(jobRepository);
jobLauncherTestUtils.setJobLauncher(jobLauncher);
}
@Test
public void testJob() throws Exception {
JobParametersBuilder j = new JobParametersBuilder();
JobParameters jobParameters = j.addDate("runDate", new Date())
.addString("file", testFile.getAbsolutePath())
.addString("override", "false")
.addString("weekly", "false")
.toJobParameters();
JobExecution jobExecution = jobLauncherTestUtils.launchJob(jobParameters);
Assert.assertEquals("COMPLETED", jobExecution.getExitStatus().getExitCode());
}
}
在测试中运行作业时,它会提交到数据库。如何防止提交到数据库?通常,我可以添加@Transactional 以在每次测试后回滚事务。但是,当我在测试类中添加注释时,我收到:
java.lang.IllegalStateException: Existing transaction detected in JobRepository. Please fix this and try again (e.g. remove @Transactional annotations from client).
更新
我尝试将@Rollback 添加到测试类。但是,JpaItemWriter 仍然提交。
这是应用程序代码中事务管理器的配置:
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory);
return transactionManager;
}
@Bean
public Step stepLoadFile(StepBuilderFactory stepBuilderFactory,
PlatformTransactionManager transactionManager,
ItemReader<MyClass> reader, ItemProcessor<MyClass,
MyClass> processor,
ItemWriter<MyClass> writer,
ReadFailureHandler readListenerSupport,
WriteFailureHandler writeListenerSupport) {
Step step = stepBuilderFactory.get("stepPersistFile")
.transactionManager(transactionManager)
.<MyClass, MyClass> chunk(1000)
.reader(reader)
.processor(processor)
.listener(writeListenerSupport)
.listener(readListenerSupport)
.writer(writer)
.build();
return step;
}
【问题讨论】:
-
我假设您已经检查过您的数据源/连接未处于自动提交模式?
-
感谢您的评论。对于相同的数据源/连接,我有使用
@Transactional注释的存储库测试。这些测试保存到数据库并在每次测试结束后回滚。因此,它似乎不在自动提交模式下。我想知道 Spring Batch 是否在对launchJob的调用中提交事务。因此,测试没有任何回滚,因为它已经在对launchJob的调用中提交。
标签: spring spring-boot spring-data-jpa spring-batch spring-test