Expand Authors Top

If you have a few years of experience in the Java ecosystem and you’d like to share that with the community, have a look at our Contribution Guidelines.

November Discount Launch 2022 – Top
We’re finally running a Black Friday launch. All Courses are 30% off until next Friday:

>> GET ACCESS NOW

November Discount Launch 2022 – TEMP TOP (NPI)
We’re finally running a Black Friday launch. All Courses are 30% off until next Friday:

>> GET ACCESS NOW

Expanded Audience – Frontegg – Security (partner)
announcement - icon User management is very complex, when implemented properly. No surprise here.

Not having to roll all of that out manually, but instead integrating a mature, fully-fledged solution - yeah, that makes a lot of sense.
That's basically what Frontegg is - User Management for your application. It's focused on making your app scalable, secure and enjoyable for your users.
From signup to authentication, it supports simple scenarios all the way to complex and custom application logic.

Have a look:

>> Elegant User Management, Tailor-made for B2B SaaS

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 GreetingsTest {
    @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 GreetingsTest {
    // ...
}

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 GreetingsTest {
    @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 GreetingsSpringTest {
    // ...
}

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 GreetingsSpringTest {
    // ...
}

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.

November Discount Launch 2022 – Bottom
We’re finally running a Black Friday launch. All Courses are 30% off until next Friday:

>> GET ACCESS NOW

Junit footer banner
Comments are closed on this article!