【发布时间】:2021-01-26 22:54:21
【问题描述】:
我们有一个 bean CompanyProcessor。 在spring boot集成测试中,我们想测试这个bean中的方法抛出异常时的异常场景。
因此,我们创建了一个重写 bean TestCompanyProcessor,它扩展了 CompanyProcessor。 TestCompanyProcessor 被标记为@Primary。当我们只运行这个测试类时,测试运行良好并且被覆盖的 bean 按预期使用。
但是这个测试类与其他几个测试类一起运行,每个测试类都标记为@SpringBootTest,我们看到这个测试在第一个实例中失败,因为它没有使用覆盖的bean,而是使用了这个原始bean。我们对失败进行自动重试,最多可重试 3 次。在第二次或第三次重试时,它以某种方式找到了正确的被覆盖的主 bean,并且测试通过了。
有什么原因,为什么它在第一个实例中找到原始 bean,然后在与其他几个测试类一起运行时在随后的重试中找到正确的覆盖 bean。
被覆盖的bean定义如下。
@Primary
@Component
@ConditionalOnExpression("'${test.company.processor}' == 'true'")
class TestCompanyProcessor
在我们的测试课上
@TestPropertySource(properties = {"test.company.processor=true"})
class TestCompanyProcessorTest {
}
附: 当我们使用@Mockbean 注解时,我们看到了相同的行为
【问题讨论】:
标签: java spring spring-boot junit spring-boot-test