Assert an Exception is Thrown in JUnit 4 and 5

1. Introduction

In this quick tutorial, we’ll be looking at how to test if an exception was thrown, using JUnit library.

Of course, we’ll make sure to cover both the JUnit 4 and JUnit 5 versions.

Further reading:

The Order of Tests in JUnit

Learn how to run JUnit tests in a custom order.

Read more

Assertions in JUnit 4 and JUnit 5

A look at assertions in both JUnit 4 and 5.

Read more

2. JUnit 5

JUnit 5 Jupiter assertions API introduces the assertThrows method for asserting exceptions.

This takes the type of the expected exception, and an Executable functional interface where we can pass the code under test through a lambda expression:

@Test
public void whenExceptionThrown_thenAssertionSucceeds() {
    String test = null;
    assertThrows(NullPointerException.class, () -> {
        test.length();
    });
}

It’s important to note here that this assertion is satisfied when the enclosed code throws an exception of type NullPointerException or any of its derived types.

This means if we pass Exception as the expected exception type, any exception thrown will make the assertion succeed since Exception is the supertype for all exceptions.

If we change the test above to expect a RuntimeException, this will also pass:

@Test
public void whenDerivedExceptionThrown_thenAssertionSucceds() {
    String test = null;
    assertThrows(RuntimeException.class, () -> {
        test.length();
    });
}

The assertThrows() method enables more fine-grained control for exception assertion logic because we can use __ it around specific parts of the code.

3. JUnit 4

When using JUnit 4, we can simply use the expected attribute of the @Test annotation to declare we expect an exception to be thrown anywhere in the annotated test method.

As a result, the test will fail if the specified exception isn’t thrown when the test is run and will pass if it’s thrown:

@Test(expected = NullPointerException.class)
public void whenExceptionThrown_thenExpectationSatisfied() {
    String test = null;
    test.length();
}

In this example, we’ve declared that we’re expecting our test code to result in a NullPointerException.

This is enough if we’re only interested in asserting that an exception is thrown.

When we need to verify some other properties of the exception, we can use the ExpectedException rule.

Let’s see an example of verifying the message property of an exception:

@Rule
public ExpectedException exceptionRule = ExpectedException.none();

@Test
public void whenExceptionThrown_thenRuleIsApplied() {
    exceptionRule.expect(NumberFormatException.class);
    exceptionRule.expectMessage("For input string");
    Integer.parseInt("1a");
}

In the example above, we’re first declaring the ExpectedException rule. Then, in our test, we’re asserting that the code that attempts to parse an Integer value will result in a NumberFormatException with the message “For input string”.

4. Conclusion

In this article, we focused on and covered asserting exceptions with both JUnit 4 and JUnit 5.

The full source code for the examples is available over on GitHub.

Leave a Reply

Your email address will not be published.