【问题标题】:Multiple expected exceptions in JUnitJUnit 中的多个预期异常
【发布时间】:2013-12-06 20:01:13
【问题描述】:

应用程序在某些 thatMethod() 中抛出 2 个不同的异常。我希望通过 JUnit 对其进行测试。

我可以使用 ExpectedException@Rule 来搁置应用程序预期抛出的“自然”异常。 How do you assert that a certain exception is thrown in JUnit 4 tests? 正在解释这一点。

在我的情况下,我该怎么做 - 2 个或更多“自然”例外? ExpectedException 没有持有多个预期异常。

还有其他方法可以做到这一点——再次在How do you assert that a certain exception is thrown in JUnit 4 tests? 中解释。我想知道是否有办法做到这一点 通过使用 JUnit 的内置功能。

【问题讨论】:

  • 你可以设置一个普通的parent异常类型,然后尝试利用parametrized JUnit tests。这仅适用于您正在测试一种方法(顺便说一句,确实应该如此)。不理想,但它仍然可以工作:我正在使用它来测试针对不同方法参数组合引发的相同异常,但无需设置单独的测试。

标签: exception junit expected-exception


【解决方案1】:

我发现这种方式是因为 JUnit 函数只接受一个异常。

@Test
public void checkRuleValidation() {
    Rule rule = generateRules(1, "rule.json").get(0);
    // rule name validation
    rule.setRuleName(null);
    try {
        ruleResource.saveRule(rule);
        // expecting exception if no assert false
        assertTrue(false);
    } catch (BadRequestException br) {
        assertTrue(true);
    }

    //validating rule action
    rule.setRuleAction(null);
    try {
        ruleResource.saveRule(rule);
        // expecting exception if no assert false
        assertTrue(false);
    } catch (AuthorizationException br) {
        assertTrue(true);
    }
}

【讨论】:

    【解决方案2】:

    单个测试方法只能退出一次,因此只能抛出一个异常。如果您想确认您的代码可能以两种不同的方式失败,那么您有两个单独的测试;将其拆分为两个测试方法,并在每个测试方法上声明特定的异常。

    【讨论】:

    • 我希望保留多个预期的异常——这样测试就不会在它们发生时退出。
    • 如果您真的在单个测试中需要它们,则需要使用显式的try/fail/catch 块,如this question .您会注意到,对该问题的高度投票接受的答案建议将其分解为单独的测试;这仍然是我的建议。
    【解决方案3】:

    您可以使用ErrorCollector 收集多个异常并在测试结束时验证它们。但是您必须手动将异常添加到收集器中,因为 JUnit 只能看到您的测试方法,并且在方法执行期间无法做任何事情。

    【讨论】:

    • ErrorCollector 堆积了测试用例抛出的多个 AssertionErrors。我希望让 JUnit 识别应用程序可能抛出的多个预期错误,以便我可以在测试期间忽略它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 2017-07-11
    • 2011-05-28
    相关资源
    最近更新 更多