在 JUnit 4.11 中结合@ClassRule和@Rule

2022-09-02 01:36:23

在 JUnit 4.10 及更低版本中,可以将规则注释为@Rule和@ClassRule。这意味着规则在类之前/之后以及每次测试之前/之后被调用。这样做的一个可能原因是设置一个昂贵的外部资源(通过@ClassRule调用),然后廉价地重置它(通过@Rule调用)。

从 JUnit 4.11 开始,@Rule字段必须是非静态的,@ClassRule字段必须是静态的,因此上述操作不再可能。

显然有解决方法(例如,明确地将@ClassRule和@Rule责任划分为单独的规则),但是必须强制使用两个规则似乎是一种耻辱。我简要地研究了使用@Rule并推断它是否是第一个/最后一个测试,但我不相信信息是可用的(至少,它不是直接在描述上可用的)。

在 JUnit 4.11 中,是否有一种整洁的方式将@ClassRule和@Rule功能组合到单个规则中?

谢谢,罗文


答案 1

从 JUnit 4.12(在撰写本文时未发布)开始,可以使用 和 对单个静态规则进行注释。@Rule@ClassRule

请注意,它必须是静态的 - 一个非静态规则,用 注释仍然被认为是无效的(因为任何注释的东西都在类级别工作,所以只有作为静态成员才真正有意义)。@Rule@ClassRule@ClassRule

如果您有兴趣了解更多详细信息,请参阅发行说明和我的拉取请求


答案 2

另一种可能的解决方法是声明静态@ClassRule并在声明非静态@Rule时使用该值:

@ClassRule
public static BeforeBetweenAndAfterTestsRule staticRule = new BeforeBetweenAndAfterTestsRule();
@Rule
public BeforeBetweenAndAfterTestsRule rule = staticRule;

这意味着您不必重构任何现有的规则类,但您仍然需要声明两个规则,因此它不会特别好地回答原始问题。


推荐