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上下文之后再次加载它,从而导致异常。问题是如何防止额外的上下文加载。我尝试过:这是一个很好的尝试,但不幸的是没有帮助。仍在获取InstanceAlreadyExistsException
InstanceAlreadyExistsException
。你能想到其他我可以试试的吗?