Junit @Rule и @ClassRule

Я пишу тест JUnit4, в котором я использую правило TemporaryFolder. Кажется, что он отлично работает как с @Rule, так и с @ClassRule. В чем разница между Junit @Rule и @ClassRule? Почему я должен использовать один, а не другой?

Ответ 1

Различие становится ясным, когда у вас есть более одного метода тестирования в классе.

@ClassRule имеет свой метод before() запущенный перед любым из тестовых методов. Затем запускаются все методы тестирования и, наконец, метод after(). Так что если у вас есть пять тестовых методов в классе, before() и after() будут запускаться только один раз каждый.

@ClassRule применяется к статическому методу, и поэтому имеет все ограничения, присущие этому.

@Rule заставляет тесты запускаться с помощью метода rule apply(), который может выполнять действия до и после запуска целевого метода. Если у вас есть пять тестовых методов, правило apply() вызывается пять раз, как обертка вокруг каждого метода.

Используйте @ClassRule для настройки чего-либо, что может быть повторно использовано всеми методами тестирования, если вы можете добиться этого статическим методом.

Используйте @Rule чтобы настроить что-то, что нужно создать или сбросить для каждого метода тестирования.

Ответ 2

@Rule не может быть настроен для запуска до @BeforeClass.

В то время как @ClassRule должен быть статическим.

Ответ 3

Ссылка: Аннотирует статические поля, которые ссылаются на правила или методы, которые их возвращают. Поле должно быть открытым, статическим и подтипом TestRule. Метод должен быть открытым статическим и возвращать подтип TestRule.

Оператор, переданный в TestRule, будет запускать любые методы BeforeClass, затем все тело тестового класса (все содержащиеся в нем методы, если это стандартный тестовый класс JUnit, или все содержащиеся в нем классы, если это Suite), и, наконец, любой AfterClass. методы.

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