Как работает Junit @Rule?

Я хочу написать тестовые примеры для большого количества кода, мне бы хотелось узнать подробности функции аннотации JUnit @Rule, чтобы я мог использовать его для написания тестовых примеров. Пожалуйста, предоставьте несколько хороших ответов или ссылок, которые дают подробное описание его функциональности на простом примере.

Ответ 1

Правила используются для добавления дополнительных функций, которые применяются ко всем тестам в тестовом классе, но более общим образом.

Например, ExternalResource выполняет код до и после тестового метода без использования @Before и @After. Использование ExternalResource, а не @Before и @After дает возможности для лучшего повторного использования кода; то же правило может использоваться из двух разных тестовых классов.

Дизайн был основан на: перехватчиках в JUnit

Подробнее см. JUnit wiki: Правила.

Ответ 2

Правила Junit работают по принципу АОП (аспектно-ориентированное программирование). Он перехватывает метод теста, тем самым предоставляя возможность делать некоторые вещи до или после выполнения конкретного метода тестирования.

Возьмем пример кода ниже:

public class JunitRuleTest {

  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();

  @Test
  public void testRule() throws IOException {
    File newFolder = tempFolder.newFolder("Temp Folder");
    assertTrue(newFolder.exists());
  }
} 

Каждый раз, когда выполняется вышеуказанный метод тестирования, создается временная папка и удаляется после выполнения метода. Это пример правильного кода, предоставленного Junit.

Подобное поведение также может быть достигнуто путем создания наших собственных правил. Junit предоставляет интерфейс TestRule, который может быть реализован для создания собственного правила Junit.

Вот некоторые полезные ссылки для справки:

Ответ 3

Я нашел в этой статье, объясняет @Rule довольно хорошо, особенно проверьте последний раздел "Последовательность событий в деталях"

Ответ 4

tl; dr для того, как это работает: JUnit обертывает ваш тестовый метод в объекте Statement, поэтому statement.Execute() запускает ваш тест. Затем вместо вызова функции statement.Execute() непосредственно для запуска вашего теста JUnit передает Statement в TestRule с аннотацией @Rule. Функция "применить" TestRule возвращает новое Заявление, данное Заявление с вашим тестом. Новый метод Execute() может вызывать метод выполнения Test Statement (или не вызывать его несколько раз) и делать то, что он хочет до и после. Теперь JUnit имеет новое выражение, которое делает больше, чем просто запуск теста, и он может снова передать это на любые другие правила, прежде чем, наконец, вызовет Execute.