In Java how can I validate a thrown exception with JUnit?

exception, java, junit

Solution

In JUnit 4 it can be easily done using ExpectedException rule.

Here is example from javadocs:

// These tests all pass.
public static class HasExpectedException {
    @Rule
    public ExpectedException thrown = ExpectedException.none();

    @Test
    public void throwsNothing() {
        // no exception expected, none thrown: passes.
    }

    @Test
    public void throwsNullPointerException() {
        thrown.expect(NullPointerException.class);
        throw new NullPointerException();
    }

    @Test
    public void throwsNullPointerExceptionWithMessage() {
        thrown.expect(NullPointerException.class);
        thrown.expectMessage("happened?");
        thrown.expectMessage(startsWith("What"));
        throw new NullPointerException("What happened?");
    }
}

Problem

When writing unit tests for a Java API there may be circumstances where you want to perform more detailed validation of an exception. I.e. more than is offered by the @test annotation offered by JUnit. For example, consider an class that should catch an exception from some other Interface, wrap that exception and throw the wrapped exception. You may want to verify: - The exact method call that throws the wrapped exception. - That the wrapper exception has the original exception as its cause. - The message of the wrapper exception. The main point here is that you want to be perf additional validation of an exception in a unit test (not a debate about whether you should verify things like the exception message). What's a good approach for this?

Original source