How to assert that a certain exception is thrown in JUnit tests

Abdul D.
jump to solution

The Problem

I don’t know how to assert that a certain exception is thrown in JUnit tests.

The Solution

Depending on the version of JUnit you’re using, you can assert that a specific exception is thrown during the execution of a test in one of the following ways:

  • JUnit 4: Use the @Test annotation with the expected parameter.
  • JUnit 4 and 5: Use a try-catch block with the fail() method.
  • JUnit 5: Use the `assertThrows() method.

Using @Test(expected = ...)

In JUnit 4, you can use the @Test annotation with the expected parameter to assert that a specific exception is thrown:

import org.junit.Test;

public class ExceptionTest {
    @Test(expected = IllegalArgumentException.class)
    public void testExceptionIsThrown() {
        throwException();
    }

    private void throwException() {
        throw new IllegalArgumentException("Invalid argument");
    }
}

In this example, the test passes if an IllegalArgumentException is thrown during the execution of the testExceptionIsThrown method.

Using a try-catch block with fail()

In versions 4 and 5 of JUnit, you can also use a try-catch block to assert that an exception is thrown, calling fail() if it is not:

import org.junit.Test;
import static org.junit.Assert.fail;

public class ExceptionTest {
    @Test
    public void testExceptionIsThrown() {
        try {
            throwException();
            fail("Expected IllegalArgumentException to be thrown");
        } catch (IllegalArgumentException e) {
            // test passes if exception is thrown
        }
    }

    private void throwException() {
        throw new IllegalArgumentException("Invalid argument");
    }
}

In this example, the test fails if the exception is not thrown, ensuring that the expected exception is properly tested.

Using assertThrows()

JUnit 5 introduced the assertThrows() method, which provides a more readable way to assert that an exception is thrown:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertThrows;

public class ExceptionTest {
    @Test
    public void testExceptionIsThrown() {
        assertThrows(IllegalArgumentException.class, () -> {
            throwException();
        });
    }

    private void throwException() {
        throw new IllegalArgumentException("Invalid argument");
    }
}

In this example, assertThrows() takes the exception class and a lambda expression. The test passes if the specified exception is thrown.

Considered "not bad" by 4 million developers and more than 150,000 organizations worldwide, Sentry provides code-level observability to many of the world's best-known companies like Disney, Peloton, Cloudflare, Eventbrite, Slack, Supercell, and Rockstar Games. Each month we process billions of exceptions from the most popular products on the internet.

Sentry