# JUnit Assert That an Exception Is Thrown in a Test

> Use assertThrows() in JUnit 5, the @Test(expected=...) annotation in JUnit 4, or a try-catch block with fail() to test for a thrown exception

**URL:** https://sentry.io/answers/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 `@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:

```java
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:

```java
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:

```java
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.

---

*Source: [sentry.io/answers/how-to-assert-that-a-certain-exception-is-thrown-in-junit-tests/](https://sentry.io/answers/how-to-assert-that-a-certain-exception-is-thrown-in-junit-tests/)*
