How to assert that a certain exception is thrown in JUnit tests
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
@Testannotation with theexpectedparameter. - 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.