使用JUnit @Test捕获异常(expected = Exception.Class)

时间:2016-02-23 16:31:45

标签: java junit

我正在使用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);
}

任何帮助将不胜感激。

由于

1 个答案:

答案 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;
    }