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.

Jedna myśl na temat “JUnit 5 – Zagnieżdżanie testów

Napisz odpowiedź

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax