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?
Odpowiedz
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.
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
znalazłem this article wyjaśnia @Rule
s raczej dobrze, zwłaszcza sprawdzić ostatnią sekcję „Kolejność zdarzeń w szczegółach”
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:
, więc zostanie usunięty bez pisania żadnego kodu do usunięcia/wyczyszczenia obiektu? – Dror
@Dror: Tak. To jest poprawne. –
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
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.
Instrukcja ma metodę assess not execute. – Hemanth
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
Myślę, że jest podobny do pojęcia iniekcji, czy mam rację? – Chao
[Zasady Junit zostały wyjaśnione w tym artykule] (http://www.singhajit.com/junit-rules/) –