【问题标题】:How to assert for an exception while catching it at the same time?如何在捕获异常的同时断言异常?
【发布时间】:2014-01-24 03:36:18
【问题描述】:

我正在为我的面向对象编程课程构建一个扑克牌程序并比较卡片。当创建一个新的 PokerHand 对象时,我将 5 个卡片对象传递给它。然后我需要检查任何重复的卡片,如果有,抛出一个新的 DuplicateCardException。

这是针对该异常的 JUnit 测试:

@Test(expected = DuplicateCardException.class)
public void tryToAddTheSameCardTwice() {
    new PokerHand(C2, C3, C4, C5, C5);
}

你显然不能有 2 个 5 的梅花,所以在比较纸牌时,我抛出了异常。但后来我得到了红色条,它失败了。经过大量研究,听起来它失败了,因为我发现了异常,所以 JUnit 测试无法检测到它。但是如果我没有捕捉到它,那么编译器就会抱怨没有处理异常。

这是抛出异常的方法(card4和card5都是“C5”对象):

public void checkForDuplicates() {
    try {
        if(card4==card5)
            throw new DuplicateCardException();

    } catch (DuplicateCardException e) {e.printStackTrace();}       
}

所以我的问题是如何在不更改实际测试代码的情况下让 JUnit 测试知道引发了异常? (因为这是我正在评分的内容)我尝试在方法标题中添加“抛出 DuplicateCardException”,而不是在测试区域中包含 try/catch 块,然后它通过了,但我无法更改测试代码。

【问题讨论】:

标签: java exception exception-handling junit junit4


【解决方案1】:

如果您需要编辑代码但不允许编辑测试用例以添加throws 声明,您可能需要取消选中异常。这是通过扩展 RuntimeException(或其子类)而不是 Exception 来实现的。

【讨论】:

  • 我得到了绿条。非常感谢!
【解决方案2】:

您只需要在测试方法的 throws 子句中声明您的异常。

@Test(expected = DuplicateCardException.class)
public void tryToAddTheSameCardTwice() throws DuplicateCardException {
    new PokerHand(C2, C3, C4, C5, C5);
}

这样编译器就不会抱怨了。在执行测试期间,Junit 将抛出并捕获异常,这将报告测试为 OK(绿色),因为您告诉了他(注解 @Test(expected = DuplicateCardException.class))。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 2016-02-17
    相关资源
    最近更新 更多