我正在使用JUnit编写测试用例,我正在尝试使用Exception
捕获@Test(expected=Exception.Class)
。出于某种原因,我无法抓住exception
。如果我传递null
它会抛出NullPointerException
并且测试会抓住它,因为Exception
是父类,但在我的Coverage报告中,仍然没有涵盖异常。
待测方法:
private static final String CONTENT_LENGTH = "Content-Length";
protected long getContentLength( MultivaluedMap<String, String> headers ) {
String length = headers.getFirst( CONTENT_LENGTH );
if( length != null ) {
try {
return Long.valueOf( length );
} catch( Exception e ) {}
}
return 0;
}
JUnit测试用例:
@Test(expected=Exception.class)
public void testGetContentLength() {
new TestBaseMessageBodyReader().getContentLength(null);
}
任何帮助将不胜感激。
由于
答案 0 :(得分:2)
捕获通用异常是不好的做法,更糟糕的是捕获异常并且什么都不做。在你的try catch中你应该捕获 NumberFormatException ,这就是Long.valueOf有可能抛出的东西。即使这样你的jUnit也不会永远捕获异常,因为你正在捕获异常但没有对它做任何事情,该方法总是会返回0,因为它当前已写入(假设你没有传递null)
以下是一些可以捕获单元测试异常的代码。我将创建两个单元测试,一个用于捕获第一个异常,另一个用于捕获第二个异常。
protected long getContentLength(MultivaluedMap<String, String> headers)
{
if(null == headers)
{
throw new SomeCustomException("some message");
}
Long returnValue = 0;
String length = headers.getFirst(CONTENT_LENGTH);
try
{
returnValue = Long.valueOf(length);
}
catch (NumberFormatException e) {
// if you can recover handle it here
// if you can't recover then break the app
throw new SomeOtherCustomException("some other message");
}
return returnValue;
}