繁体   English   中英

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

[英]Catching Exception with JUnit @Test(expected=Exception.Class)

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

任何帮助,将不胜感激。

谢谢

捕获通用异常是一种不好的做法,更糟糕的是捕获异常却什么也不做。 在尝试捕获中,您应该捕获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;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM