Я пишу тест JUnit4, в котором я использую правило TemporaryFolder. Кажется, что он отлично работает как с @Rule, так и с @ClassRule. В чем разница между Junit @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