为啥 JUnit 测试异常总是失败? [复制]

Posted

技术标签:

【中文标题】为啥 JUnit 测试异常总是失败? [复制]【英文标题】:Why JUnit Testing exception always fail? [duplicate]为什么 JUnit 测试异常总是失败? [复制] 【发布时间】:2015-08-04 18:35:02 【问题描述】:

我正在使用 JUnit 4.11。

Eclipse 版本:Luna Service Release 2 (4.4.2)

我需要做异常测试。代码可能是这样的:

// src code
public void myMethod throws MyException 
    ...
    throw new MyException(msg);
    ...


// test code
@Test (expected = MyException.class)
public void testMyMethod() 
    try 
        myMethod();
        fail();
     catch (MyException e) 
        assertEquals(expectedStr, e.getMessage());
    

但是测试总是失败,我哪里错了?

【问题讨论】:

补充@rgettman 的(正确)答案:您应该使用JUnit 的ExpectedException 测试异常。 【参考方案1】:

当您向Test 注释提供expected 异常时,只有在测试方法抛出预期的异常时测试才会成功。但是,您会在异常传播出方法之前捕获它。

看来您也想测试异常消息,所以重新throw 异常e 以满足测试。根据是否检查,您可能需要在方法上使用throws 子句。

【讨论】:

我不建议捕获异常只是为了测试消息并重新抛出它以满足测试。最好使用ExpectedException 规则。 如果您想测试消息以及抛出异常的事实,您可以简单地删除expected = MyException.class 并将其余代码保留在此处。这就是您在将异常添加到 JUnit 之前测试异常的方式,它仍然有效。 @Seelenvirtuose 是的,我认为你的建议很好。 @Seelenvirtuose 是的,这比回到旧样式要好。 但是只测试是否抛出异常呢?如果我没有捕捉到异常,我将无法通过 Eclipse 运行该项目。这意味着,我必须捕获异常。所以 @Test (expected = MyException.class) 没有意义。

以上是关于为啥 JUnit 测试异常总是失败? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

获取存储在类中的异常对象时,Junit 测试失败,而不是抛出

JUnit 测试用例中“失败”的实际用途是啥?

为啥 Cakephp 的 Controller 第二个测试用例总是失败

为啥邮件总是发送失败?请帮我测试一下

为啥我的测试一起运行时通过,但单独失败?

为啥ERP的交换数据库连接测试总是失败