I have written a few JUnit tests with @Test
annotation. If my test method throws a checked exception and if I want to assert the message along with the exception, is there a way to do so with JUnit @Test
annotation? AFAIK, JUnit 4.7 doesn't provide this feature but does any future versions provide it? I know in .NET you can assert the message and the exception class. Looking for similar feature in the Java world.
This is what I want:
@Test (expected = RuntimeException.class, message = "Employee ID is null") public void shouldThrowRuntimeExceptionWhenEmployeeIDisNull() {}
JUnit 4 Assert Exception Message. If we want to test exception message, then we will have to use ExpectedException rule. Below is a complete example showing how to test exception as well as exception message. That's all for a quick roundup on testing expected exceptions in JUnit 5 and JUnit 4.
In order to handle the assertion error, we need to declare the assertion statement in the try block and catch the assertion error in the catch block.
In JUnit 5, to write the test code that is expected to throw an exception, we should use Assertions. assertThrows(). In the given test, the test code is expected to throw an exception of type ApplicationException or its subtype. Note that in JUnit 4, we needed to use @Test(expected = NullPointerException.
You could use the @Rule
annotation with ExpectedException
, like this:
@Rule public ExpectedException expectedEx = ExpectedException.none(); @Test public void shouldThrowRuntimeExceptionWhenEmployeeIDisNull() throws Exception { expectedEx.expect(RuntimeException.class); expectedEx.expectMessage("Employee ID is null"); // do something that should throw the exception... System.out.println("=======Starting Exception process======="); throw new NullPointerException("Employee ID is null"); }
Note that the example in the ExpectedException
docs is (currently) wrong - there's no public constructor, so you have to use ExpectedException.none()
.
In JUnit 4.13 you can do:
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThrows; ... @Test void exceptionTesting() { IllegalArgumentException exception = assertThrows( IllegalArgumentException.class, () -> { throw new IllegalArgumentException("a message"); } ); assertEquals("a message", exception.getMessage()); }
This also works in JUnit 5 but with different imports:
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; ...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With