Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I assert my exception message with JUnit Test annotation?

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() {} 
like image 472
Cshah Avatar asked Mar 18 '10 12:03

Cshah


People also ask

How do you assert a specific exception in JUnit?

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.

How do you handle exceptions in assert?

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.

How do I validate exceptions in JUnit 5?

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.


2 Answers

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().

like image 185
Jesse Merriman Avatar answered Sep 24 '22 11:09

Jesse Merriman


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;  ... 
like image 31
Johan Boberg Avatar answered Sep 24 '22 11:09

Johan Boberg