1. Overview

In this short tutorial, we’re going to implement non-static methods with @BeforeAll and @AfterAll annotations available in Junit5.

2. @BeforeAll and @AfterAll in Non-Static Methods

While unit testing, we may occasionally want to use @BeforeAll and @AfterAll in non-static setup and tear-down methods — for instance, in a @Nested test class or as interface default methods.

Let’s create a test class with the @BeforeAll and @AfterAll methods as non-static:

public class BeforeAndAfterAnnotationsUnitTest {

    String input;
    Long result;

    @BeforeAll
    public void setup() {
        input = "77";
    }

    @AfterAll
    public void teardown() {
        input = null;
        result = null;
    }

    @Test
    public void whenConvertStringToLong_thenResultShouldBeLong() {
        result = Long.valueOf(input);
        Assertions.assertEquals(77l, result);
    }​
}

If we run the above code, it will throw an exception:

org.junit.platform.commons.JUnitException:  ...

Let’s now see how we can avoid this situation.

3. The @TestInstance Annotation

We’ll use the @TestInstance annotation to configure the lifecycle of a test. If we don’t declare it on our test class, the lifecycle mode will be PER_METHOD by default*.* So, **to prevent our test class from throwing a JUnitException, we need to annotate it with *@TestInstance(TestInstance.***Lifecycle.PER_CLASS).

Let’s redo our test class and add the *@TestInstance(TestInstance.*Lifecycle.PER_CLASS):

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class BeforeAndAfterAnnotationsUnitTest {

    String input;
    Long result;

    @BeforeAll
    public void setup() {
        input = "77";
    }

    @AfterAll
    public void teardown() {
        input = null;
        result = null;
    }

    @Test
    public void whenConvertStringToLong_thenResultShouldBeLong() {
        result = Long.valueOf(input);
        Assertions.assertEquals(77l, result);
    }
}

In this case, our test runs successfully.

4. Conclusion

In this short article, we’ve learned how to use @BeforeAll and @AfterAll in non-static methods. First, we started with a simple non-static example to show what happens if we don’t include the @TestInstance annotation. Then, we annotated our test with @TestInstance(TestInstance.Lifecycle.PER_CLASS) to prevent throwing a JUnitException.

As always, the implementation of all these examples is over on GitHub.