1. Introduction

In this quick tutorial, we’ll discuss the use of the @RunWith annotation in the JUnit 5 framework.

In JUnit 5, the @RunWith annotation has been replaced by the more powerful @ExtendWith annotation.

However, the @RunWith annotation can still be used in JUnit 5 for the sake of backward compatibility.

2. Running Tests With a JUnit 4-Based Runner

We can run JUnit 5 tests with any older JUnit environment using the @RunWith annotation.

Let’s look at an example of running tests in an Eclipse version that only supports JUnit 4.

First, let’s create the class we’re going to test:

public class Greetings {
    public static String sayHello() {
        return "Hello";
    }  
}

Then we’ll create this plain JUnit 5 test:

public class GreetingsUnitTest {
    @Test
    void whenCallingSayHello_thenReturnHello() {
        assertTrue("Hello".equals(Greetings.sayHello()));
    }
}

Finally, let’s add this annotation so we’re able to run the test:

@RunWith(JUnitPlatform.class)
public class GreetingsUnitTest {
    // ...
}

The JUnitPlatform class is a JUnit 4 based runner that lets us run JUnit 4 tests on the JUnit Platform.

Let’s keep in mind that JUnit 4 doesn’t support all the features of the new JUnit Platform, so this runner has limited functionality.

If we check the results of the test in Eclipse, we can see that a JUnit 4 runner was used:

junit4 test

3. Running Tests in a JUnit 5 Environment

Now let’s run the same test in an Eclipse version that supports JUnit 5. In this case, we don’t need the @RunWith annotation anymore, and we can write the test without a runner:

public class GreetingsUnitTest {
    @Test
    void whenCallingSayHello_thenReturnHello() {
        assertTrue("Hello".equals(Greetings.sayHello()));
    }
}

The test results show that we’re now using the JUnit 5 runner:

junit5 test

4. Migrating From a JUnit 4-Based Runner

Now let’s migrate a test that uses a JUnit 4 based runner to JUnit 5.

We’re going to use a Spring test as an example:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { SpringTestConfiguration.class })
public class GreetingsSpringUnitTest {
    // ...
}

If we want to migrate this test to JUnit 5, we need to replace the @RunWith annotation with the new @ExtendWith:

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = { SpringTestConfiguration.class })
public class GreetingsSpringUnitTest {
    // ...
}

The SpringExtension class is provided by Spring 5, and integrates the Spring TestContext Framework into JUnit 5. The @ExtendWith annotation accepts any class that implements the Extension interface.

5. Conclusion

In this brief article, we covered the use of JUnit 4’s @RunWith annotation in the JUnit 5 framework.

The full source code for this article is available over on GitHub.