如何在同时捕获异常时声明异常?

时间:2014-01-24 03:36:18

标签: java exception exception-handling junit junit4

我正在为扑克手建立一个程序,并为我的面向对象编程类比较卡片。当创建一个新的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块然后它通过,但我无法更改测试代码。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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

相关问题