====== JUnit 5 ======
* Java 8 necessary
===== Most used annotations =====
* ''@Test''
* ''@BeforeEach''
* ''@BeforeAll''
* ''@AfterEach''
* ''@AfterAll''
* ''@Disabled''
* //Test Method//:
* any instance method that is directly annotated or meta-annotated with ''@Test'', ''@RepeatedTest'', ''@ParameterizedTest'', ''@TestFactory'', or ''@TestTemplate''.
* not ''private''
* not (more) required to be ''public''
==== Meta-Annotations / Composed Annotations ====
Multiple annotations can be composed to one, which can be used later instead.
=== Example 1 ===
Replace ''@Tag("fast")'' with ''@Fast''
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Tag("fast")
public @interface Fast {
}
Usage:
@Fast
@Test
void myFastTest() {
// ...
}
=== Example 2 ===
Combine ''@Tag("fast")'' and ''@Test'' to one ''@FastTest''.
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Tag("fast")
@Test
public @interface FastTest {
}
Usage:
@FastTest
void myFastTest() {
// ...
}
==== Assertions ====
* Using lambdas
* Grouped assertions
* Dependent assertions
* Exception testing
* Timeout not exceeded
* (simply)
* with result
* with method
* Timeout exceeded
* (simply)
* with preemptive termination
* Kotlin assertions support
* Third party library support
* AssertJ
* Hamcrest
* Truth
==== Assumptions ====
In direct contrast to failed assertions, failed assumptions do not result in a test failure; rather, a failed assumption results in a test being aborted.
Assumptions are typically used whenever it does not make sense to continue execution of a given test method — for example, if the test depends on something that does not exist in the current runtime environment.
* assumeTrue()
* assumeFalse()
* assumingThat()
==== Conditional Test Execution ====
* ''@DisabledOnOs''
* ''@DisabledOnJre'' / ''@DisabledForJreRange''
* ''@DisabledIfEnvironmentVariable'' / ''@DisabledIfEnvironmentVariables''
* ''@DisabledIfSystemProperty'' / ''@DisabledIfSystemProperties''
* ''@EnabledOnOs''
* ''@EnabledOnJre'' / ''@EnabledForJreRange''
* ''@EnabledIfEnvironmentVariable'' / ''@EnabledIfEnvironmentVariables''
* ''@EnabledIfSystemProperty'' / ''@EnabledIfSystemProperties''
==== Test Execution Order ====
@TestMethodOrder(OrderAnnotation.class)
class OrderedTestsDemo {
@Test
@Order(1)
void nullValues() {
// perform assertions against null values
}
@Test
@Order(2)
void emptyValues() {
// perform assertions against empty values
}
@Test
@Order(3)
void validValues() {
// perform assertions against valid values
}
}
==== Test Instance Lifecycle ====
==== Parameterized Tests ====
* ''@ParameterizedTest''
==== Repeated Tests ====
* @RepeatedTest
==== Dynamic Tests ====
* @TestFactory
==== Templates for Test Cases ====
* @TestTemplate
=== Misc ===
* ''@TestMethodOrder'' - defines test method execution order
* ''@TestInstance'' - ???
* ''@DisplayName'' - declares custom display name for test
* ''@DisplayNameGeneration'' - declares custom display name generator
* ''@Nested'' - ???
* ''@Tag'' - makes possible grouping of tests either on class or on method level
* ''@Timeout'' - used to fail tests, if their execution exceeds a given duration
* ''@ExtendWith'' - ???
* ''@RegisterExtension'' - ???
* ''@TempDir'' - ???
----
==== JUnit 5 Pros ====
* More granularity
* Multiple runners work simultaneously
* Java 8 language features
==== JUnit 4 -> JUnit 5 ====
* @Before -> @BeforeEach
* @After -> @AfterEach
* @BeforeClass -> @BeforeAll
* @AfterClass -> @AfterAll
* @Ignore -> @Disabled