Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE

1. Overview

When writing unit tests, we sometimes provide multiple assertions of the output. The test stops when the first of these assertions fail. This means that we don’t find out if any of the later assertions would have passed or failed, which can increase debugging time.

We can solve this problem by wrapping multiple assertions up into a single action.

In this short tutorial, we’ll learn how to use the assertAll() method introduced in JUnit5 and see how it’s different from using multiple assertions.

2. Model

We’ll use a User class to help with our examples:

public class User {
    String username;
    String email;
    boolean activated;
    //constructors
   //getters and setters
}

3. Using Multiple Assertions

Let’s start with an example where all of our assertions would fail:

User user = new User("baeldung", "[email protected]", false);
assertEquals("admin", user.getUsername(), "Username should be admin");
assertEquals("[email protected]", user.getEmail(), "Email should be [email protected]");
assertTrue(user.getActivated(), "User should be activated");

After running the test only the first assertion fails:

org.opentest4j.AssertionFailedError: Username should be admin ==> 
Expected :admin
Actual   :baeldung

Let’s say we fix the failing code or test and re-run the test. We’d then get a second failure, and so on. It would be better, in this situation, to group all these assertions into a single pass/failure.

4. Using the assertAll() Method

We can group assertions with JUnit5 using assertAll().

4.1. Understanding assertAll()

The assertAll() assertion function takes a collection of multiple Executable objects:

assertAll(
  "Grouped Assertions of User",
  () -> assertEquals("baeldung", user.getUsername(), "Username should be baeldung"),
  // more assertions
  ...
 );

We can therefore use lambdas to provide each of our assertions. The lambda will be called to run the assertion within the grouping provided by assertAll().

Here, in the first parameter to assertAll(), we’ve also provided a description to explain the meaning of the whole group.

4.2. Grouping Assertions Using assertAll()

Let’s see the complete example:

User user = new User("baeldung", "[email protected]", false);
assertAll(
  "Grouped Assertions of User",
  () -> assertEquals("admin", user.getUsername(), "Username should be admin"),
  () -> assertEquals("[email protected]", user.getEmail(), "Email should be [email protected]"),
  () -> assertTrue(user.getActivated(), "User should be activated")
);

Now, let’s see what happens when we run the test:

org.opentest4j.MultipleFailuresError: Grouped Assertions of User (3 failures)
org.opentest4j.AssertionFailedError: Username should be admin ==> expected: <admin> but was: <baeldung>
org.opentest4j.AssertionFailedError: Email should be [email protected] ==> expected: <[email protected]> but was: <[email protected]>
org.opentest4j.AssertionFailedError: User should be activated ==> expected: <true> but was: <false>

Contrary to what happened with multiple assertions, this time all the assertions were executed and their failures were reported in the MultipleFailuresError message.

We should note that assertAll() only handles AssertionError. If any assertion were to end with an exception, rather than the usual AssertionError, execution stops immediately and the error output would relate to the exception, rather than MultipleFailuresError.

5. Conclusion

In this article, we learned to use assertAll() in JUnit5 and saw how it’s different than using multiple individual assertions.

As always, the complete code for the tutorial is available over on GitHub.

Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE
res – REST with Spring (eBook) (everywhere)
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.