Why @Rule annotated fields in JUnit has to be public?

java, junit, junit-rule, public

Solution

The JUnit runner will need to access the field reflectively to run the rule. If the field was private the access would throw `IllegalAccessException`.

Another option would have been to have the runner modify the access from private to public before running the rule. However that could cause problems in case a security manager is enabled.

If you want to avoid having public fields in your test class you can from JUnit 4.11 annotate methods that return a `Rule` with `@Rule` or `@ClassRule`.

Problem

In JUnit test case, a field annotated by `@Rule` must be public. It breaks a common Java coding convention (all class member variables should not be public). Why does JUnit require this? Documentation for `@Rule`: https://github.com/junit-team/junit/blob/master/src/main/java/org/junit/Rule.java

Original source