如果JUnit测试返回预期的异常,是否有可能成功?
您能告诉我如何通过简化示例实现此类测试吗?
非常感谢。
答案 0 :(得分:6)
为什么你不能在测试中发现你的异常?有不同的方法可以做到这一点。就像注释@Test(expected = DataAccessException.class)
一样,需要根据具体情况使用。但我的建议是以下方式。
public class TestCase{
@Test
public void method1_test_expectException () {
try{
// invoke the method under test...
Assert.fail("Should have thrown an exception");
// This above line would only be reached if it doesnt throw an exception thus failing your test.
}
catch(<your expected exception> e){
Assert.assertEquals(e.getcode(), somce error code);
}
}
答案 1 :(得分:3)
在JUnit4中实现这一目标的正确方法是使用ExpectedException公共字段,注明@Rule
,如下所示:
import org.junit.rules.ExpectedException;
import org.junit.Rule;
import org.junit.Test;
public class MyTestClass {
@Rule
public ExpectedException thrown = ExpectedException.none();
@Test
public void aTestThatSucceedsOnlyIfRuntimeExceptionIsThrown() {
thrown.expect(RuntimeException.class);
// invoke code to be tested...
}
}
请注意,您还使用@Test(expected=RuntimeException.class)
但前者通常被认为是优越的,原因如下:它允许您指定测试中应该抛出异常的确切点。如果使用后者,如果中的任何行抛出异常(预期类型),通常不是您想要的,那么测试将成功。
答案 2 :(得分:0)
测试用例:
public class SimpleDateFormatExampleTest {
@SuppressWarnings("deprecation")
@Test(expected=ParseException.class)
public void testConvertStringToDate() throws ParseException {
SimpleDateFormatExample simpleDateFormatExample = new SimpleDateFormatExample();
Assert.assertNotNull(simpleDateFormatExample.convertStringToDate("08-16-2011"));
以下内容将在没有(expected=ParseException.class)
Assert.assertNotNull(simpleDateFormatExample.convertStringToDate("08/16/2011"));
}
测试类
public class SimpleDateFormatExample {
public Date convertStringToDate(String dateStr) throws ParseException{
return new SimpleDateFormat("mm/DD/yyyy").parse(dateStr);
}
}