2012-11-21 4 views
151

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

+0

Я уже прошел через эту ссылку [http://cwd.dhemery.com/2011/01/what-junit-rules-are-good-for/](http://cwd.dhemery.com/2011/ 01/what-junit-rules-are-good-for /) – Dipak

+0

Я думаю, что это похоже на концепцию инъекции, я прав? – Chao

+0

[Правила Junit разъяснены в этой статье] (http://www.singhajit.com/junit-rules/) –

ответ

120

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

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

Проект был основан на: Interceptors in JUnit

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

+0

Исправление: «Например, ExternalResource выполняет код до и после теста * class *." Что-то об использовании apply(), чтобы заставить ExternalResource работать между тестами. – derekm

19

Я нашел this article объясняет @Rule сек, а также, в частности проверить последний раздел «Последовательность событий в деталях»

40

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

, поэтому он удаляется без написания кода для удаления/очистки объекта? – Dror

+1

@Dror: Да. Правильно. –

+0

Посмотрите на источник https://github.com/junit-team/junit4/blob/master/src/main/java/org/junit/rules/TemporaryFolder.java, папка создана в обратном вызове before() метод и удаляется в методе обратного вызова after() ... – PierluigiVernetto

9

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

+0

У оператора есть метод оценки, который не выполняется. – Hemanth

Смежные вопросы