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

Abdul D.
—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 = ...)
@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()
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()
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.
- Sentry BlogException Handling in Java (with Real Examples)
- Syntax.fmListen to the Syntax Podcast
- Listen to the Syntax Podcast
![Syntax.fm logo]()
Tasty treats for web developers brought to you by Sentry. Get tips and tricks from Wes Bos and Scott Tolinski.
SEE EPISODES
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.
