Junit @Rule 和 @ClassRule

56

我正在编写一个使用TemporaryFolder规则的JUnit4测试。看起来在@Rule和@ClassRule两种情况下它都可以正常工作。Junit @Rule和@ClassRule之间有什么区别?为什么我应该使用其中之一而不是另一个?

3个回答

113
当一个类中有多个测试方法时,@ClassRule的区别变得清晰。 @ClassRulebefore()方法在任何测试方法之前运行。然后运行所有测试方法,最后运行规则的after()方法。因此,如果类中有五个测试方法,则before()after()方法仍然只会分别运行一次。 @ClassRule适用于静态方法,因此具有静态方法固有的所有限制。 @Rule通过规则的apply()方法运行测试,并可以在目标方法运行前后执行操作。如果您有五个测试方法,则规则的apply()会包装每个方法并调用五次。
如果可以在静态方法中实现,则使用@ClassRule设置可以由所有测试方法重复使用的内容。
使用@Rule设置需要为每个测试方法新建或重置的内容。

简单、简洁明了——与官方Javadoc不同。 - Matheus Felipe
毫无疑问,@ClassRule 上仅有的几个易于理解的简单解释之一。 - Kunal gupta
使用注释@BeforeClass和@Before如何?为什么需要ClassRule和Rule? - Apurva Singh

3

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

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


0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接