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(...)