为啥 JUnit 中的 @Rule 注释字段必须是公开的?

Posted

技术标签:

【中文标题】为啥 JUnit 中的 @Rule 注释字段必须是公开的?【英文标题】:Why @Rule annotated fields in JUnit has to be public?为什么 JUnit 中的 @Rule 注释字段必须是公开的? 【发布时间】:2012-12-29 10:09:14 【问题描述】:

在 JUnit 测试用例中,@Rule 注释的字段必须是公共的。它打破了常见的 Java 编码约定(所有类成员变量都不应该是公共的)。为什么 JUnit 需要这个?

@Rule 的文档:https://github.com/junit-team/junit/blob/master/src/main/java/org/junit/Rule.java

【问题讨论】:

【参考方案1】:

JUnit 运行器将需要以反射方式访问该字段以运行规则。如果该字段是私有的,则访问将抛出IllegalAccessException

另一种选择是让运行者在运行规则之前将访问权限从私有修改为公共。但是,如果启用了安全管理器,这可能会导致问题。

如果您想避免在测试类中包含公共字段,您可以从 JUnit 4.11 中注释返回 Rule@Rule@ClassRule 的方法。

【讨论】:

+1 您还可以使用@Rule 注释方法,这样可以避免问题。您应该将此添加到您的答案中。 谢谢马修,我不知道。显然是 4.11 中的新功能。 @KErlandsson - 你完全确定吗?这就是 JUnit API 文档所说的:“字段必须是公共的,而不是静态的,并且是 TestRule(首选)或 MethodRule 的子类型” @dziki 你指的是什么?我确定到底是什么?

以上是关于为啥 JUnit 中的 @Rule 注释字段必须是公开的?的主要内容,如果未能解决你的问题,请参考以下文章

Junit @Rule如何运作?

Junit @Rule 和 @ClassRule

JUnit4.10源码分析5.2 Rule

JUnit的Rule的使用

Junit 外部资源@Rule 顺序

为啥伴随对象不使用 JUnit 测试作为私有字段进行测试?