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();
}
}
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
的组合,但没有任何区别。
Since it is already launched, the tests fail on InstanceAlreadyExistsException.
这意味着数据源在测试之间重复使用,当第二次测试 运行s 时,它将尝试启动相同的作业实例。
在您的 createJobParameters()
方法中,您可以使用 JobLauncherTestUtils#getUniqueJobParameters
创建唯一的作业参数,并 运行 为每个测试创建不同的作业实例。
最终我们意识到是内部框架包装 Spring 导致了问题(上下文加载等愚蠢的静态实例化)。
为了解决问题,我们在一个有问题的 class 上使用了 @MockBean
,并在测试 class.
上方的注释中使用了 @EnableAutoConfiguration( exclude = ProblematicConfiguration.class)
我在 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();
}
}
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
的组合,但没有任何区别。
Since it is already launched, the tests fail on InstanceAlreadyExistsException.
这意味着数据源在测试之间重复使用,当第二次测试 运行s 时,它将尝试启动相同的作业实例。
在您的 createJobParameters()
方法中,您可以使用 JobLauncherTestUtils#getUniqueJobParameters
创建唯一的作业参数,并 运行 为每个测试创建不同的作业实例。
最终我们意识到是内部框架包装 Spring 导致了问题(上下文加载等愚蠢的静态实例化)。
为了解决问题,我们在一个有问题的 class 上使用了 @MockBean
,并在测试 class.
@EnableAutoConfiguration( exclude = ProblematicConfiguration.class)