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:
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:
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.