public class Person { private final String name; private final int age; /** * Creates a person with the specified name and age. * * @param name the name * @param age the age * @throws IllegalArgumentException if the age is not greater than zero */ public Person(String name, int age) { this.name = name; this.age = age; if (age <= 0) { throw new IllegalArgumentException("Invalid age:" + age); } } }In the example above, the
Person
constructor throws an IllegalArgumentException
if the age of the person is not greater than zero. There are different ways to test this behaviour:
Approach 1: Use the ExpectedException RuleThis is my favourite approach. The ExpectedException rule allows you to specify, within your test, what exception you are expecting and even what the exception message is. This is shown below:
import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; public class PersonTest { @Rule public ExpectedException exception = ExpectedException.none(); @Test public void testExpectedException() { exception.expect(IllegalArgumentException.class); exception.expectMessage(containsString("Invalid age")); new Person("Joe", -1); } }Approach 2: Specify the exception in the @Test annotation
As shown in the code snippet below, you can specify the expected exception in the
@Test
annotation. The test will pass only if an exception of the specified class is thrown by the test method. Unfortunately, you can't test the exception message with this approach.
@Test(expected = IllegalArgumentException.class) public void testExpectedException2() { new Person("Joe", -1); }Approach 3: Use a try-catch block
This is the "traditional" approach which was used with old versions of JUnit, before the introduction of annotations and rules. Surround your code in a try-catch clause and test if the exception is thrown. Don't forget to make the test fail if the exception is not thrown!
@Test public void testExpectedException3() { try { new Person("Joe", -1); fail("Should have thrown an IllegalArgumentException because age is invalid!"); } catch (IllegalArgumentException e) { assertThat(e.getMessage(), containsString("Invalid age")); } }
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.