Junit @Rule 和 @ClassRule

Posted

技术标签:

【中文标题】Junit @Rule 和 @ClassRule【英文标题】:Junit @Rule and @ClassRule 【发布时间】:2017-04-28 13:17:56 【问题描述】:

我正在编写使用 TemporaryFolder 规则的 JUnit4 测试。似乎它适用于@Rule 和@ClassRule。 有什么区别?为什么我应该使用一个而不是另一个?

【问题讨论】:

【参考方案1】:

@Rule 不能设置为在@BeforeClass 之前运行。

而@ClassRule 必须在静态方法上。

【讨论】:

【参考方案2】:

当你在一个类中有多个测试方法时,区别就变得很明显了。

@ClassRulebefore() 方法在任何测试方法之前运行。然后运行所有的测试方法,最后是规则的after() 方法。因此,如果您在一个类中有五个测试方法,before()after() 仍然只会运行一次。

@ClassRule 适用于静态方法,因此具有其固有的所有限制。

@Rule 使测试通过规则的 apply() 方法运行,该方法可以在目标方法运行之前和之后执行操作。如果您有五个测试方法,则规则的 apply() 被调用五次,作为每个方法的包装器。

使用@ClassRule 设置可以被所有测试方法重用的东西,如果你可以在静态方法中实现的话。

使用@Rule 设置需要为每种测试方法创建新或重置的内容。

【讨论】:

简单,言简意赅——不同于官方的Javadoc。谢谢!【参考方案3】:

Ref:注释引用规则或返回它们的方法的静态字段。字段必须是公共的、静态的,并且是 TestRule 的子类型。方法必须是公共静态的,并且返回 TestRule 的子类型。

传递给 TestRule 的语句将运行任何 BeforeClass 方法,然后是测试类的整个主体(所有包含的方法,如果它是标准 JUnit 测试类,或所有包含的类,如果它是套件),以及最后是任何 AfterClass 方法。

https://junit.org/junit4/javadoc/4.12/org/junit/ClassRule.html

【讨论】:

以上是关于Junit @Rule 和 @ClassRule的主要内容,如果未能解决你的问题,请参考以下文章

Junit @Rule如何运作?

为啥 JUnit 中的 @Rule 注释字段必须是公开的?

Junit 外部资源@Rule 顺序

JUnit4.10源码分析5.2 Rule

如何在 JUnit 5 中替换 WireMock @Rule 注释?

如何将 JUnit TemporaryFolder @Rule 与 Spring @Value 属性一起使用?