SpringBatchTest 多重测试 类 - 抛出 InstanceAlreadyExistsException

SpringBatchTest multiple test classes - throws InstanceAlreadyExistsException

我在 Spring 批处理应用程序上使用 @SpringBatchTest 到 运行 端到端测试。 一切正常,除非我 运行 我的两个测试 类 (将我的测试分成 positive/negative 测试 类)在一起。第一个 运行s 和测试通过,但第二个尝试再次启动上下文失败。由于它已经启动,因此测试在 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();
}
}

TestClass2TestClass1 相同,只是数据准备和断言不同。

另外我的测试属性如下:

# Spring Boot configuration
spring.main.allow-bean-definition-overriding=true
spring.batch.job.enabled=false
# Spring Batch configuration
spring.batch.job.names=myBatchJob

我已经尝试了所有 truefalse 的组合,但没有任何区别。

Since it is already launched, the tests fail on InstanceAlreadyExistsException.

这意味着数据源在测试之间重复使用,当第二次测试 运行s 时,它将尝试启动相同的作业实例。

在您的 createJobParameters() 方法中,您可以使用 JobLauncherTestUtils#getUniqueJobParameters 创建唯一的作业参数,并 运行 为每个测试创建不同的作业实例。

最终我们意识到是内部框架包装 Spring 导致了问题(上下文加载等愚蠢的静态实例化)。

为了解决问题,我们在一个有问题的 class 上使用了 @MockBean,并在测试 class.

上方的注释中使用了 @EnableAutoConfiguration( exclude = ProblematicConfiguration.class)