尽管有DirtiesContext.ClassMode.BEFORE_CLASS

时间:2017-02-03 09:18:30

标签: java spring unit-testing spring-test

给出以下类定义:

@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

1 个答案:

答案 0 :(得分:-1)

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

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

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