JUnit 5

https://junit.org/junit5/docs/current/user-guide/

Lifecycle Annotations

class StandardTest {
@BeforeAll
static void initAll() {...}
@AfterAll
static void tearDownAll() {...}
@BeforeEach
void init() {...}
@AfterEach
void tearDown() {...}
@Test
void testAdd_shouldDoSomething() {...}
}

@BeforeClass wird einmal bei der Initialisierung der Klasse ausgeführt.

@AfterClass wird einmal vor verlassen der Klasse ausgeführt

@Before wird vor jeder Test-Methode ausgeführt

@After wird nach jeder Test-Methode ausgefüht

Assertions in JUnit

Zusicherungen nach org.junit.jupiter.api.Assertions;

Bessere Lesbarkeit wenn statisch importiert:

import static org.junit.jupiter.api.Assertions.assertEquals;

assertEquals(1, person.getId(), “Person ID not as expected");org.opentest4j.AssertionFailedError: Person ID not as expected ==>
Expected :1
Actual :0
assertAll(
() -> assertTrue(...),
() -> assertEquals(...)
)

Assertions mit AssertJ

https://joel-costigliola.github.io/assertj/

Eigenes Assertion-Framework

Bessere Lesbarkeit, Nachvollziehbarkeit indem Methoden aufeinanderfolgend aufgerufen werden können.

JUnit:   assertEquals(customer.getId(), person.getId());
AssertJ: assertThat(person.getId()).isEqual(customer.getId());

Exceptions testen

assertThrows(Class<T> expectedType, Executable executable)

Parametrisierte Tests

Eigene dependency: juni-jupiter-params

@ParameterizedTest

  • @ValueSource(ints = { 1, 2, 3 })
  • @EnumSource(TimeUnit.class)
  • @MethodSource("stringProvider")
  • @CsvFileSource(resources = "/data.csv")
  • ...

@ParameterizedTest
@MethodSource ("palindromeData")
void isPalindrome_shouldReturnTrue(String string) {
assertThat(isPalindrome (string) ).isTrue();
}private static Stream<String> palindromeData () {
return Stream.of("radar", "anna", "otto", "Reittier", "Programmieren");
}

Weitere Extensions

org.junit.jupiter.api.extension

TestWatcher, BeforeTestExecutionCallback, AfterTestExecutionCallback, …

Annotation der Tests mit @ExtendsWith(...)