Sometimes I just want to check for an exception without

  1. Exiting the test case
  2. Adding a lot of exception handling crap in the test code.

Java 8 to the rescue!

package se.fnord;

import org.junit.Test;

import static org.junit.Assert.fail;

public class AssertThrows {
    @FunctionalInterface
    interface ThrowingMethod {
        void run() throws Throwable;
    }

    private static void assertThrows(Class<? extends Throwable> expected, ThrowingMethod method) {
        try {
            method.run();
            fail("Method did not throw");
        }
        catch (Throwable t) {
            if (expected != t.getClass())
                fail("Unexpected exception " + t.getClass());
        }
    }

    @Test
    public void testMatchedException() {
        assertThrows(IllegalArgumentException.class, () -> { throw new IllegalArgumentException(); });
    }

    @Test(expected=AssertionError.class)
    public void testUnmatchedException() {
        assertThrows(IllegalArgumentException.class, () -> { throw new IllegalStateException(); });
    }
}

Comment