Jam*_*mes 8 spring spring-test spring-batch spring-data-jpa spring-boot
我有写入数据库的 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());
}
}
Run Code Online (Sandbox Code Playgroud)
在测试中运行作业时,它会提交到数据库。如何防止提交到数据库?通常,我可以@Transactional在每次测试后添加回滚事务。但是,当我将注释添加到测试类时,我收到:
java.lang.IllegalStateException: Existing transaction detected in JobRepository. Please fix this and try again (e.g. remove @Transactional annotations from client).
Run Code Online (Sandbox Code Playgroud)
更新
我试图添加@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;
}
Run Code Online (Sandbox Code Playgroud)
我想你有 transactionManager,如果有的话,添加
@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=true)
Run Code Online (Sandbox Code Playgroud)
在你的测试班的顶部。
| 归档时间: |
|
| 查看次数: |
2719 次 |
| 最近记录: |