Почему аннотированные поля @Rule в JUnit должны быть общедоступными?

В тестовом примере 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.