Jak działa Junit @Rule?

195

Chcę pisać przypadki testowe dla dużej części kodu, chciałbym poznać szczegóły dotyczące @Rulefunkcji adnotacji JUnit , aby móc używać jej do pisania przypadków testowych. Podaj kilka dobrych odpowiedzi lub linków, które podają szczegółowy opis jego funkcjonalności za pomocą prostego przykładu.

Dipak
źródło
Znalazłem ten artykuł@Rule dość dobrze wyjaśnia , szczególnie sprawdź ostatni rozdział „Sekwencja wydarzeń w szczegółach”
Peter Perháč
Myślę, że jest podobny do koncepcji iniekcji, mam rację?
Chao
Dziękujemy za udostępnienie tego linku. Jedno nie jest jasne. Kiedy wywoływana jest instrukcja DEFAULT Statement.evaluate ()? Czy jest wywoływany przed oceną () wszystkich reguł czy po nich wszystkich? Domyślam się po nich wszystkich.
MasterJoe2
@ testerjoe2 możesz całkowicie zignorować domyślną instrukcję. Możesz zdecydować się na oddelegowanie go lub po prostu zastąpić go całkowicie innym własnym oświadczeniem. To nie sprawdzony , ty może wezwać go, czy nie. To było w punkcie 10: „Metoda oceny () instrukcji zrzutu ekranu wywołuje domyślną metodę oceny ().”
Peter Perháč

Odpowiedzi:

155

Reguły służą do dodawania dodatkowej funkcjonalności, która ma zastosowanie do wszystkich testów w klasie testów, ale w bardziej ogólny sposób.

Na przykład, ExternalResource wykonuje kod przed i po metodzie testowej, bez konieczności używania @Beforei @After. Użycie ExternalResourceraczej niż @Beforei @Afterdaje możliwości lepszego ponownego wykorzystania kodu; tę samą regułę można zastosować z dwóch różnych klas testów.

Projekt został oparty na: Przechwytywacze w JUnit

Aby uzyskać więcej informacji, zobacz Wiki JUnit: zasady .

Matthew Farwell
źródło
1
Korekta: „Na przykład ExternalResource wykonuje kod przed i po klasie testowej .” Jest coś w używaniu metody apply (), aby uruchomić ExternalResource między testami.
derekm
62

Reguły Junita działają na zasadzie AOP (programowanie aspektowe). Przechwytuje metodę testową, zapewniając w ten sposób możliwość wykonania pewnych czynności przed lub po wykonaniu określonej metody testowej.

Weź przykład poniższego kodu:

public class JunitRuleTest {

  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();

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

Za każdym razem, gdy wykonywana jest powyższa metoda testowa, tworzony jest folder tymczasowy, który jest usuwany po wykonaniu metody. To jest 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 stworzenia własnej reguły Junit.

Oto przydatny link w celach informacyjnych:

Abhishek Mohanty
źródło
4
więc jest usuwany bez pisania kodu do usunięcia / wyczyszczenia obiektu?
Dror
spójrz na źródło github.com/junit-team/junit4/blob/master/src/main/java/org/… , folder jest tworzony w metodzie wywołania przed () i usuwany w metodzie wywołania po (). ..
Pierluigi Vernetto,
1
Dla osób, które mogły nie zrozumieć, dlaczego TemporaryFolder jest usuwany, dzieje się tak, ponieważ jest to TemporaryFolder udostępniany przez Junit, który służy jako folder tymczasowy, który jest automatycznie usuwany - tzn. Krok porzucenia jest częścią samej klasy TemporaryFolder.
Mindaugas Bernatavičius
17

Wyjaśnienie, jak to działa:

JUnit opakowuje metodę testową w obiekt Statement, więc instrukcja i Execute()uruchamia test. Następnie zamiast wywoływać statement.Execute()bezpośrednio w celu uruchomienia testu, JUnit przekazuje instrukcję do reguły testowej z @Ruleadnotacją. Funkcja „zastosuj” TestRule zwraca nowe Oświadczenie, biorąc pod uwagę Oświadczenie wraz z testem. Nowa Execute()metoda instrukcji może wywoływać testową metodę wykonywania instrukcji (lub nie, lub wywoływać ją wiele razy) i robić, co chce before and after.

Teraz JUnit ma nową instrukcję, która nie tylko uruchamia test, i może ponownie przekazać ją do innych reguł przed ostatecznym wywołaniem polecenia Wykonaj.

Alexander Taylor
źródło
2
Instrukcja ma metodę oceny nie wykonać.
Hemanth,
0

Reguły są używane do ogólnego poprawienia działania każdej metody testowej. Reguła Junita przechwytuje metodę testową i pozwala nam coś zrobić, zanim metoda testowa rozpocznie wykonywanie i po wykonaniu metody testowej.

Na przykład za pomocą reguły @Timeout możemy ustawić limit czasu dla wszystkich testów.

public class TestApp {
    @Rule
    public Timeout globalTimeout = new Timeout(20, TimeUnit.MILLISECONDS);

    ......
    ......

 }

@ Reguła współczesnego folderu służy do tworzenia folderów tymczasowych, plików. Za każdym razem, gdy wykonywana jest metoda testowa, tworzony jest folder tymczasowy, który jest usuwany po wykonaniu metody.

public class TempFolderTest {

 @Rule
 public TemporaryFolder tempFolder= new TemporaryFolder();

 @Test
 public void testTempFolder() throws IOException {
  File folder = tempFolder.newFolder("demos");
  File file = tempFolder.newFile("Hello.txt");

  assertEquals(folder.getName(), "demos");
  assertEquals(file.getName(), "Hello.txt");

 }


}

Możesz zobaczyć przykłady niektórych wbudowanych reguł dostarczonych przez junit pod tym linkiem .

Hari Krishna
źródło