assertAll() vs Multiple Assertions in JUnit5 – assertAll()与JUnit5中的多个断言对比

最后修改: 2022年 10月 30日

1. Overview


When writing unit tests, we sometimes provide multiple assertions of the output. The test stops when the first of these assertions fails. 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;
   //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", "", false);
assertEquals("admin", user.getUsername(), "Username should be admin");
assertEquals("", user.getEmail(), "Email should be");
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().

我们可以用JUnit5使用 assertAll()来分组断言。

4.1. Understanding assertAll()

4.1 了解assertAll()

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

assertAll() assertion函数接收一个多个Executable对象的集合。

  "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", "", false);
  "Grouped Assertions of User",
  () -> assertEquals("admin", user.getUsername(), "Username should be admin"),
  () -> assertEquals("", user.getEmail(), "Email should be"),
  () -> 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 ==> expected: <> but was: <>
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.