SpringBootTest中的MockBean取决于执行顺序,尽管DirtiesContext.ClassMode.BEFORE_CLASS

问题描述 投票:7回答:1

给出以下类定义:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = Application.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
public class ErrorHandlerTest{
    @MockBean
    private ErrorHandler errorHandler;

@MockBean带注释的类ErrorHandler的成功注入取决于所有测试的执行顺序。由于该类的DirtiesContext设置为BEFORE_CLASS,因此我不希望其他类产生副作用。

  • 如果首先执行此测试,则将注入模拟的Bean,并且测试成功。
  • 如果在此测试之前执行了任何其他测试,则不会注入模拟的Bean,但是会重用上下文。导致测试失败。

起初,我以为DirtiesContext可能会覆盖模拟的Bean,但是当测试成功地独立执行时(或以正确的顺序执行),并且没有任何迹象表明存在实际的新上下文。我无视那个想法。

如果测试前的类用DirtiesContext.ClassMode.AFTER_CLASS注释,则将注入模拟的Bean。

为什么在上课前不使用AFTER_CLASS,而当前班上不使用BEFORE_CLASS

java spring unit-testing spring-test
1个回答
0
投票

@@ BeforeClass用于测试中的代码初始化,而@ AfterClass用于代码上下文清除。

标记为@@ Before的代码在每次测试之前执行,而@@ BeforeClass在整个测试装置之前运行一次。

在您的情况下,您正在寻找清理上下文,而不是在测试执行之前初始化参数,因此@ AfterClass是可行的。

© www.soinside.com 2019 - 2024. All rights reserved.