尽管有DirtiesContext.ClassMode.BEFORE_CLASS,但SpringBootTest中的MockBean依赖于执行顺序

Flo*_*ian 7 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;
Run Code Online (Sandbox Code Playgroud)

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

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

起初我认为DirtiesContext可以覆盖模拟的Bean,但是当测试成功执行时(或以正确的顺序),并且没有任何实际新上下文的指示.我无视这个想法.

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

为什么AFTER_CLASS在上班前在课堂上使用,但BEFORE_CLASS在当前的课堂上没有?

小智 0

当您在当前的测试类中说 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS) 时,就像在说:“嘿,让我们在任何测试开始之前把事情搞砸!” 这意味着在第一次测试开始之前一切都会重置,即使之前设置了一些很酷的东西,比如你的 @MockBean 东西。

现在,如果您在前一堂课中使用 @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS),就好像在说:“等一下,让我们在该班级的所有测试完成后进行整理。” 这可以确保在测试开始之前一切都是干净的,因此不会与上一堂课中发生的情况混淆。

简而言之,在 BEFORE_CLASS 和 AFTER_CLASS 之间进行选择取决于您希望何时进行此清理。在你之前的课程中使用 AFTER_CLASS 就像在测试开始之前确保一切都干净整洁,因此不会出现意外的混乱。但是,如果您在当前课程中使用 BEFORE_CLASS,那么如果在您的模拟 bean 成为节目明星之前没有正确完成清理工作,事情可能会变得有点棘手。