Spring boot SpringBatchTest多个测试类-抛出InstanceAlreadyExistsException
我正在使用Spring boot SpringBatchTest多个测试类-抛出InstanceAlreadyExistsException,spring-boot,spring-batch,spring-test,spring-boot-test,Spring Boot,Spring Batch,Spring Test,Spring Boot Test,我正在使用@SpringBatchTest在我的Spring批处理应用程序上运行e2e测试。 除了同时运行两个测试类(将测试分为阳性/阴性测试类)外,其他测试都运行良好。第一个运行并通过测试,但第二个尝试再次启动上下文失败。由于它已启动,因此在InstanceAlreadyExistsException上测试失败 我的两个测试类都使用以下注释定义: @RunWith(SpringRunner.class) @SpringBatchTest @EnableAutoConfiguration @Co
@SpringBatchTest
在我的Spring批处理应用程序上运行e2e测试。
除了同时运行两个测试类(将测试分为阳性/阴性测试类)外,其他测试都运行良好。第一个运行并通过测试,但第二个尝试再次启动上下文失败。由于它已启动,因此在InstanceAlreadyExistsException
上测试失败
我的两个测试类都使用以下注释定义:
@RunWith(SpringRunner.class)
@SpringBatchTest
@EnableAutoConfiguration
@ContextConfiguration(classes = {MyTestConfiguration.class})
@TestExecutionListeners({MockitoTestExecutionListener.class, DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class})
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
编辑:
一般来说,我的测试所做的是:
@RunWith(SpringRunner.class)
@SpringBatchTest
@EnableAutoConfiguration
@ContextConfiguration(classes = {HardDeleteTestConfiguration.class})
@TestExecutionListeners({MockitoTestExecutionListener.class, DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class})
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public class TestClass1 {
@Autowired
private JobLauncherTestUtils jobLauncherTestUtils;
@Autowired
private JobRepositoryTestUtils jobRepositoryTestUtils;
@Before
public void setUp() {
jobRepositoryTestUtils.removeJobExecutions();
}
@Test
public void SpringBatchTest() {
// preparing data for test
// ...
JobExecution jobExecution =
jobLauncherTestUtils.launchJob(createJobParams("myKey","myValue"));
// Perform assertions
// ...
}
}
private void createJobParams(String key, value) {
JobParameters uniqueJobParameters = jobLauncherTestUtils.getUniqueJobParameters();
JobParametersBuilder paramsBuilder = new JobParametersBuilder(uniqueJobParameters);
paramsBuilder.addString(key, value);
return paramsBuilder.toJobParameters();
}
}
TestClass2
与TestClass1
相同,只是数据准备和断言不同
此外,我的测试属性如下所示:
# Spring Boot configuration
spring.main.allow-bean-definition-overriding=true
spring.batch.job.enabled=false
# Spring Batch configuration
spring.batch.job.names=myBatchJob
对于前面的标志,我尝试了true
和false
的所有组合,但没有任何区别
由于InstanceAlreadyExistsException已经启动,测试失败
这意味着数据源在测试之间被重用,当第二个测试运行时,它将尝试启动同一个作业实例
在您的
createJobParameters()
方法中,您可以使用创建唯一的作业参数,并为每个测试运行不同的作业实例。最终我们意识到是内部框架包装弹簧导致了问题(在上下文加载上愚蠢的静态实例化等等)
为了解决这个问题,我们在一个有问题的类上使用了
@MockBean
,在测试类上方的注释中使用了@EnableAutoConfiguration(exclude=problematicsconfiguration.class)
。您所说的“同时运行我的两个测试类[…]是什么意思?请分享您的测试的最小代码以帮助您。我的意思是右键单击两个测试类所在的“Java”测试资源,然后选择“运行“所有测试”…”。不幸的是,由于公司政策,我无法提供测试代码。但原因是,当运行第二个测试类时,测试框架试图在第一个测试类已经加载Spring上下文之后再次加载它,从而导致异常。问题是如何防止额外的上下文加载。我尝试过:这是一个很好的尝试,但不幸的是没有帮助。仍在获取InstanceAlreadyExistsExceptionInstanceAlreadyExistsException
。你能想到其他我可以试试的吗?