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

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

4 ответов


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

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

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

для получения дополнительной информации см. JUnit wiki: правила.


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

возьмите пример приведенного ниже кода:

public class JunitRuleTest {

  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();

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

каждый раз при выполнении вышеуказанного метода тестирования создается временная папка, которая удаляется после выполнения метода. Это пример правила out-of-box, предоставленного тесты JUnit.

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

вот полезная ссылка за ссылкой:


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


tl; dr для того, как это работает: JUnit обертывает ваш метод тестирования в оператор object so.Execute () запускает тест. Тогда вместо вызова оператора.Execute () непосредственно для запуска теста JUnit передает оператор Теструлу с аннотацией @Rule. В TestRule это "применить" функция возвращает новое заявление, данное заявление с тестами. Метод Execute () нового оператора может вызывать метод execute оператора test (или нет, или вызывать его несколько раз) и делать все, что он хочет до и после. Теперь у JUnit есть новый оператор, который делает больше, чем просто запуск теста, и он может снова передать это любым правилам, прежде чем, наконец, вызвать Execute.