Junit @Rule 和@ClassRule

Junit @Rule and @ClassRule

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

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

虽然@ClassRule 必须在静态方法上。

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

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

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

A @Rule 通过规则的 apply() 方法使测试成为 运行,它可以在目标方法 运行 之前和之后做一些事情。如果您有五个测试方法,则规则的 apply() 将被调用五次,作为每个方法的包装器。

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

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

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

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

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