Junit @Rule 和 @ClassRule

问题描述 投票:0回答:3

我正在编写 JUnit4 测试,其中使用 TemporaryFolder 规则。看起来它与

@Rule
@ClassRule
都可以正常工作。 Junit
@Rule
@ClassRule
和有什么区别?为什么我应该使用一个而不是另一个?

java junit rules
3个回答
116
投票

当一个类中有多个测试方法时,这种区别就会变得很明显。

A

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

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

A

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

使用

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

使用

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


3
投票

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

@ClassRule 必须在静态方法上。


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.