意外的异常是测试失败,所以您既不需要也不想捕获一个异常。
@Test
public void canConvertStringsToDecimals() {
String str = "1.234";
Assert.assertEquals(1.234, service.convert(str), 1.0e-4);
}
直到service
不会引发IllegalArgumentException
因为str
中有一个小数点,这将是一个简单的测试失败。
预期的异常应该由@Test
的可选参数expected
参数处理。
@Test(expected=NullPointerException.class)
public void cannotConvertNulls() {
service.convert(null);
}
如果程序员又懒惰又扔Exception
,或者如果他有service
回报0.0
,会导致测试失败。只有NPE
会成功。请注意,预期的异常的子类也适用。对于NPE
s这很少见,但与IOException
s和SQLException
s很相似。
在极少数情况下,您想要测试特定的异常消息,请使用新版ExpectedException
JUnit @Rule
。现在
@Rule
public ExpectedException thrown= ExpectedException.none();
@Test
public void messageIncludesErrantTemperature() {
thrown.expect(IllegalArgumentException.class);
thrown.expectMessage("-400"); // Tests that the message contains -400.
temperatureGauge.setTemperature(-400);
}
,除非setTemperature抛出IAE
和消息包含用户试图设定的温度,则测试失败。该规则可以以更复杂的方式使用。
你举的例子可以最好地处理:
private void testNumber(String word, int number)
throws OutOfRangeNumberException {
assertEquals(word, service.convert(number));
}
@Test
public final void testZero()
throws OutOfRangeNumberException {
testNumber("zero", 0);
}
可以内嵌testNumber
;现在,它没有多大帮助。你可以把它变成一个参数化的测试类。
的ExpectedException是测试预期的例外的首选方式。 –
我同意并且已经提出了Eric的回答。 – javadeveloper
如果您需要检查异常的结构,则只需要ExpectedException。例如,CmisExceptions应该在它们内部设置一个特定的故障原因。我不得不编写测试来检查,并且为此使用了Hamcrest匹配器。如果您只是期望出现异常,请将参数用于@Test。 –