【问题标题】:SpringBatchTest multiple test classes - throws InstanceAlreadyExistsExceptionSpringBatchTest 多个测试类 - 抛出 InstanceAlreadyExistsException
【发布时间】:2019-12-02 10:16:54
【问题描述】:

我正在使用@SpringBatchTest 在我的 Spring Batch 应用程序上运行 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();
}
}

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 的所有组合,但没有任何区别。

【问题讨论】:

  • “一起运行我的两个测试类 [...]”是什么意思?请分享您的测试的最少代码以便能够帮助您。
  • 我的意思是右键单击两个测试类所在的“Java”测试资源,然后选择“运行'所有测试'...”。不幸的是,由于公司政策,我无法提供测试代码。但原因是当运行第二个测试类时,测试框架在第一个已经加载它之后尝试再次加载 Spring 上下文,导致异常。问题是如何防止额外的上下文加载。

标签: spring-boot spring-batch spring-test spring-boot-test


【解决方案1】:

由于它已经启动,测试在 InstanceAlreadyExistsException 上失败。

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

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

【讨论】:

  • 我试过了:这是一个很好的镜头,但不幸的是没有帮助。仍然收到InstanceAlreadyExistsException。还有什么你能想到的我可以尝试的吗?
【解决方案2】:

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

为了解决我们在一个有问题的类上使用了@MockBean,并在位于测试类上方的注释中使用了@EnableAutoConfiguration( exclude = ProblematicConfiguration.class)

【讨论】:

    猜你喜欢
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    相关资源
    最近更新 更多