2012-11-21 25 views
151

Chcę napisać przypadki testowe dla dużej ilości kodu, chciałbym poznać szczegóły funkcji adnotacji JUnit @Rule, dzięki czemu mogę jej używać do pisania przypadków testowych. Proszę podać dobre odpowiedzi lub linki, które podają szczegółowy opis jego funkcjonalności na prostym przykładzie.Jak działa Junit @Rule?

+0

Przeszedłem już przez ten link [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

Myślę, że jest podobny do pojęcia iniekcji, czy mam rację? – Chao

+0

[Zasady Junit zostały wyjaśnione w tym artykule] (http://www.singhajit.com/junit-rules/) –

Odpowiedz

120

Reguły są stosowane w celu dodania dodatkowych funkcji, które mają zastosowanie do wszystkich testów w klasie testowej, ale w bardziej ogólny sposób.

Na przykład ExternalResource wykonuje kod przed i po metodzie testowej, bez konieczności używania @Before i @After. Korzystanie z ExternalResource zamiast @Before i @After daje możliwości lepszego wykorzystania kodu; ta sama reguła może być używana z dwóch różnych klas testowych.

Konstrukcja została oparta na: Interceptors in JUnit

Więcej informacji można znaleźć JUnit wiki : Rules.

+0

Korekta: "Na przykład ExternalResource wykonuje kod przed i po teście * klasy *." Jest coś w używaniu apply(), aby uruchomić ExternalResource pomiędzy testami. – derekm

19

znalazłem this article wyjaśnia @Rule s raczej dobrze, zwłaszcza sprawdzić ostatnią sekcję „Kolejność zdarzeń w szczegółach”

40

Zasady JUnit pracują na zasadzie AOP (programowanie aspektowe). Przechwytuje metodę testowania, dając możliwość zrobienia pewnych rzeczy przed lub po wykonaniu określonej metody testowej.

Weźmy przykład poniższy kod:

public class JunitRuleTest { 

    @Rule 
    public TemporaryFolder tempFolder = new TemporaryFolder(); 

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

każdym razem wyżej metoda badania jest wykonywana, tymczasowy folder zostanie utworzony i zostanie usunięty po wykonaniu metody. Jest to przykład reguły out-of-box dostarczonej przez Junit.

Podobne zachowanie można również osiągnąć, tworząc własne reguły. Junit udostępnia interfejs TestRule, który można zaimplementować w celu utworzenia własnej reguły Junit.

Oto kilka przydatnych linków dla odniesienia:

+3

, więc zostanie usunięty bez pisania żadnego kodu do usunięcia/wyczyszczenia obiektu? – Dror

+1

@Dror: Tak. To jest poprawne. –

+0

spójrz na źródło https://github.com/junit-team/junit4/blob/master/src/main/java/org/junit/rules/TemporaryFolder.java, folder jest tworzony w wywołaniu zwrotnym before() metoda i usunięta w metodzie wywołania zwrotnego after() ... – PierluigiVernetto

9

tl; dr na jak to działa: JUnit zawija metodę testową w obiekcie Zestawienie tak statement.Execute() uruchamia twój test. Następnie zamiast wywoływania instrukcji statement.Execute() bezpośrednio, aby uruchomić test, JUnit przekazuje instrukcję do TestRule z adnotacją @Rule. Funkcja "Zastosuj" TestRule zwraca nową Oświadczenie, z uwzględnieniem Oświadczenia z twojego testu. Nowa metoda Execute() instrukcji może wywoływać metodę wykonywania instrukcji Test (lub nie, lub wywoływać ją wiele razy) i robić, co chce przed i po. Teraz JUnit ma nowe oświadczenie, które robi więcej niż tylko test, i może ponownie przekazać to do innych reguł, zanim w końcu wywoła Execute.

+0

Instrukcja ma metodę assess not execute. – Hemanth

Powiązane problemy