我正在编写一个使用TemporaryFolder规则的JUnit4测试。看起来在@Rule和@ClassRule两种情况下它都可以正常工作。Junit @Rule和@ClassRule之间有什么区别?为什么我应该使用其中之一而不是另一个?
@ClassRule
的区别变得清晰。
@ClassRule
的before()
方法在任何测试方法之前运行。然后运行所有测试方法,最后运行规则的after()
方法。因此,如果类中有五个测试方法,则before()
和after()
方法仍然只会分别运行一次。
@ClassRule
适用于静态方法,因此具有静态方法固有的所有限制。
@Rule
通过规则的apply()
方法运行测试,并可以在目标方法运行前后执行操作。如果您有五个测试方法,则规则的apply()
会包装每个方法并调用五次。@ClassRule
设置可以由所有测试方法重复使用的内容。@Rule
设置需要为每个测试方法新建或重置的内容。@Rule不能在@BeforeClass之前设置运行。
而@ClassRule必须在静态方法上。
参考:注释引用规则或返回它们的方法的静态字段。字段必须是公共的、静态的,并且是TestRule的子类型。方法必须是公共的、静态的,并返回TestRule的子类型。
传递给TestRule的语句将运行任何BeforeClass方法,然后运行测试类的整个主体(如果它是标准的JUnit测试类,则包含所有包含的方法;如果它是Suite,则包含所有包含的类),最后运行任何AfterClass方法。
https://junit.org/junit4/javadoc/4.12/org/junit/ClassRule.html