我正在编写JUnit4测试,其中我正在使用TemporaryFolder规则。似乎它对@Rule和@ClassRule都很好。 Junit @Rule和@ClassRule有什么区别?我为什么要使用一个而不是另一个?
答案 0 :(得分:51)
当一个类中有多个测试方法时,区别就变得清晰了。
@ClassRule
在任何测试方法之前运行before()
方法。然后运行所有测试方法,最后运行规则的after()
方法。因此,如果您在课程中有五种测试方法,before()
和after()
仍然只能运行一次。
@ClassRule
适用于静态方法,因此具有固有的所有限制。
@Rule
导致测试通过规则的apply()
方法运行,该方法可以在运行目标方法之前和之后执行操作。如果您有五种测试方法,则规则的apply()
被调用五次,作为每种方法的包装。
使用@ClassRule
设置可以被所有测试方法重用的内容,如果您可以在静态方法中实现这一点。
使用@Rule
设置需要为每个测试方法创建新内容或重置的内容。
答案 1 :(得分:2)
@Rule无法设置为在@BeforeClass之前运行。
虽然@ClassRule必须是静态方法。
答案 2 :(得分:0)
参考:注释引用返回规则或方法的静态字段。字段必须是public,static和TestRule的子类型。方法必须是public static,并返回TestRule的子类型。
传递给TestRule的Statement将运行任何BeforeClass方法,然后运行测试类的整个主体(所有包含的方法,如果它是标准的JUnit测试类,或者所有包含的类,如果它是套件),并且最后任何AfterClass方法。
https://junit.org/junit4/javadoc/4.12/org/junit/ClassRule.html