Java 使用JUnit@Test捕获异常(预期为Exception.Class)

Java 使用JUnit@Test捕获异常(预期为Exception.Class),java,junit,Java,Junit,我正在使用JUnit编写一个测试用例,并试图使用@test(expected=Exception.Class)捕获一个异常。由于某种原因,我无法捕捉到异常。如果我通过null它将抛出NullPointerException,测试将捕获它,因为Exception是父类,但在我的覆盖率报告中,异常仍然没有被覆盖 试验方法: private static final String CONTENT_LENGTH = "Content-Length"; protected long getContent

我正在使用JUnit编写一个测试用例,并试图使用
@test(expected=Exception.Class)
捕获一个
异常。由于某种原因,我无法捕捉到
异常
。如果我通过
null
它将抛出
NullPointerException
,测试将捕获它,因为
Exception
是父类,但在我的覆盖率报告中,异常仍然没有被覆盖

试验方法:

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;
}
任何帮助都将不胜感激


谢谢

捕获一般异常是一种糟糕的做法,如果捕获异常而什么也不做,则更糟糕。在试捕过程中,你应该捕捉到Long.valueOf具有投掷潜力的NumberFormatException。即使这样,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;
    }
受保护的长getContentLength(多值映射头)
{
if(null==头)
{
抛出新的SomeCustomException(“某些消息”);
}
长返回值=0;
字符串长度=headers.getFirst(内容长度);
尝试
{
returnValue=长。valueOf(长度);
}
捕获(数字格式){
//如果你能恢复,在这里处理
//如果无法恢复,请中断应用程序
抛出新的SomeOtherCustomException(“其他消息”);
}
返回值;
}

捕获泛型异常是一种糟糕的做法,更糟糕的是捕获异常却什么也不做。在试捕过程中,你应该捕捉到Long.valueOf具有投掷潜力的NumberFormatException。即使这样,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;
    }
受保护的长getContentLength(多值映射头)
{
if(null==头)
{
抛出新的SomeCustomException(“某些消息”);
}
长返回值=0;
字符串长度=headers.getFirst(内容长度);
尝试
{
returnValue=长。valueOf(长度);
}
捕获(数字格式){
//如果你能恢复,在这里处理
//如果无法恢复,请中断应用程序
抛出新的SomeOtherCustomException(“其他消息”);
}
返回值;
}

如果你通过
null
,这一行(
String length=headers.getFirst(CONTENT_length);
)抛出
NPE
,但那不是catch(它在
try catch
块之外),我认为你应该显示你的覆盖率报告。如果你通过
null
,这一行(
String length=headers.getFirst)(CONTENT_LENGTH);
)抛出
NPE
,但这不是catch(它在
try catch
块之外)我想你应该显示你的覆盖率报告。我更新了我的答案,给你一些可以解决的问题。我更新了我的答案,给你一些可以解决的问题