JUnit 5 – Zagnieżdżanie testów
Samo nazywanie i tagowanie testów nie zawsze jest wystarczające. Szczególnie że oba te mechanizmy są stosunkowo proste. Pozwalają one na organizację testów w pewien logiczny sposób. Nazwy pozwalają na odszukiwanie testów w raportach, z wykorzystaniem przeszukiwania pełnotekstowego. Tagi pozwalają na oznaczanie testów o podobnym znaczeniu w ramach całej aplikacji. Pozwala to na filtrowanie i wybiórcze uruchamianie grup testów. Nadal jednak brakuje nam mechanizmu, który pozwoliłby na na grupowanie testów na na poziomie struktury kodu. JUnit 5 wprowadza taki mechanizm.
Testy zagnieżdżone
Java pozwala na tworzenie klas wewnętrznych. Klasy te mogą być zarówno statyczne, jak i niestatyczne. Obiektu klasy statycznej jest powiązana z klasą, w której została zdefiniowana – klasą zewnętrzną. W przypadku klasy niestatycznej potrzebujemy obiekt klasy zewnętrznej, do którego dopięty będzie obiekt klasy wewnętrznej. I właśnie ten mechanizm jest wykorzystywany przez JUnit 5. Oczywiście nic za darmo. Musimy dodać adnotację @Nested do naszej klasy wewnętrznej. Klasa ta musi być niestatyczna. W przeciwnym wypadku, testy zostaną zignorowane.
Listing 1. Testy zagnieżdżone
@DisplayName("FizzBuzz should")
public class FizzBuzzJUnit5NestedTest {
private FizzBuzz sut;
@BeforeEach
public void setup() {
sut = new FizzBuzz();
}
@Nested
@DisplayName("return FizzBuzz when dividable by 3 and 5")
class DividedBy15 {
@Test
public void shouldReturnFizzBuzzIfDiv3And5() throws Exception {
assertEquals("FizzBuzz", sut.fizzBuzz(15));
}
}
@Nested
@DisplayName("return Buzz when dividable by 5")
class DividedBy5 {
@Test
public void shouldReturnBuzzIfDiv5() throws Exception {
assertEquals("Buzz", sut.fizzBuzz(5));
}
}
@Nested
@DisplayName("return Fizz when dividable by 3")
class DividedBy3 {
@Test
public void shouldReturnFizzIfDiv3() throws Exception {
assertEquals("Fizz", sut.fizzBuzz(3));
}
}
@Nested
@DisplayName("return number in other cases")
class NotDividedBy3Or5 {
@Test
public void shouldReturnVal() throws Exception {
assertEquals("2", sut.fizzBuzz(2));
}
}
}
Cały „power” tego rozwiązania jest widoczny w połączeniu z nazwaniem testów. Przy czym problem na chwilę obecną polega na tym, że po aktualizacji JUnit 5 do milestone 4, Idea nie potrafi uruchomić testów 🙁 Skazuje nas, to na walkę z konsolą. W wersji M3 jeszcze wszystko działa. Cóż, takie uroki używania softu, który jest w fazie produkcji.