1 minute read

Source

Lifecycle/Hook Points

For JUnit5, it’s @BeforeAll @AfterAll and @BeforeEach and @AfterEach. (For JUnit4, it’s @BeforeClass @AfterClass and @Before @After)

@BeforeAll will be excueted before the test class instance being created, so generally it should be static method. Unless you change the TestInstanc lifecycle from PER_METHOD to PER_CLASS by @TestInstance(TestInstance.lifecycle.PER_CLASS).

Annotations

@Test

If you only use one annotation, then it must be @Test. @Test tells JUnit that the function a test funciton.

@BeforeEach/@AfterEach

Before/After every @Test method gets called. it could be used to setup/teardown the test.

@DisplayName

Give the test function a readable output, not class/function name. for example @DisplayName("Test Suite for Class A").

@Disabled

Skip running a test. (JUnit4 it’s @Ignore)

@RepeatedTest

Run the test several times, for example @RepeatedTest(5) will run the test 5 times.

@Nested

You can use @Nested to group some tests in a test class.

Conditional Excution

  • @EnabledOnOs(OS.LINUX) / @DisabledOnOs(OS.MAC)
  • @EnabledOnJre(JRE.JAVA_11) / @DisabledOnJre(JRE.JAVA_11)
  • @EnabledIf
  • @EnabledIfSystemProperty
  • @EnabledIfEnvironmentVariable

Assertion

There are many assertions like assertEqules, assertTrue etc. In JUnit4, @Test could have parameters, but in JUnit5, all @Test paramters are move to Assertions. For example, @Test(expected = Exception.class) changes to assertThrows(Exception.class, () -> {...}); @Test(timeout = 10) will change to assertTimeout(Duration.ofMillis(10), () -> Thread.sleep(100));

Assumption

Like assertions, there are many assumptions as well, if the assumption is not matched, then the test will be skipped.

Comments