【问题标题】:What does it exactly mean to use @DirtiesContext annotation on a class?在类上使用 @DirtiesContext 注释到底意味着什么?
【发布时间】:2020-01-03 16:15:45
【问题描述】:

我一直在使用 Spring,我遇到了 spring 提供的 @DirtiesContext 注解。当您想在运行每个方法之前刷新应用程序上下文(当然以牺牲性能为代价)时,在每个方法上使用它都是有意义的,但是使用 @DirtiesContext 注释测试 class 到底意味着什么?举个例子会很有帮助。

【问题讨论】:

  • 你的意思是注释类而不是单个方法?如果是这样,类级别的注释(至少在 Spring 世界中)往往意味着“将此注释应用于所有方法”。
  • 是的。你什么时候用@DirtiesContext 注释你的类?它的 classMode 属性的值默认为 AFTER_CLASS。究竟是什么意思?
  • AFTER_CLASS 表示该上下文在类中的所有测试运行后被标记为脏,因此只有在运行后才被销毁。
  • 谢谢劳尔!这有帮助。还有一件事。如果我们根本不指定这个注解会有什么不同?
  • @Kunalgupta,我添加了对您其他评论的回复:)

标签: java spring junit


【解决方案1】:

如果您使用@DirtiesContext 注释测试类,它将在测试运行后删除应用程序上下文。这篇文章还有很多解释:DirtiesContext annotation

【讨论】:

  • 所以它会在每次测试运行后清除应用程序上下文,而不是每次测试后。如果我们根本不指定这个注解怎么办?在这种情况下,默认行为会不会相同?
  • 文章中有一个例子解释了它是如何做到的。基本上,如果不存在 DirtiesContext 注释,则类中的所有测试都将使用相同的对象实例,并且一些在其他测试之前运行的测试会因为它们引起的变化而影响其余测试的行为(前提是在之后进行彻底清理每个测试)。
  • 我读了那篇文章,我明白如果我们不在类上使用注释会发生什么,但是当你只指定默认为 After_class 的 @DirtiesContext 时,Is'这与根本不指定注释是一样的,因为无论如何您都会在类运行后重新加载上下文。因此,如果我们使用注解并且在测试中更改了某些引用,那么这将影响后续测试,对吧?
  • 你是对的。也可能存在这样的情况,当您有一个抽象测试类,其中包含您要测试的所有服务自动装配,并且扩展此抽象类的测试类可能会做出影响扩展它的其他类的更改(因此在这种情况下 DirtiesContext 可能证明是有用的,即使在默认情况下,在每节课之后)。
  • 有道理。谢谢(:
【解决方案2】:

您可以使用 classMode 属性告诉 Spring junit runner 何时删除应用程序上下文。

例如,如果你用以下标记一个类:

@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)

然后应用程序上下文将在每个测试方法之后被清除。你也有更多的选择。 课堂模式的其他选项如下:

AFTER_CLASS:关联的ApplicationContext在测试类结束后会被标记为脏。

AFTER_EACH_TEST_METHOD:在类中的每个测试方法之后,关联的 ApplicationContext 将被标记为脏。

BEFORE_CLASS:关联的ApplicationContext会在测试类之前被标记为脏。

BEFORE_EACH_TEST_METHOD:关联的 ApplicationContext 将在类中的每个测试方法之前标记为脏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-19
    • 2014-03-17
    • 2021-09-24
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    相关资源
    最近更新 更多