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