我刚开始学习JUnit。我试着在别处寻找这个答案,但我找不到它。假设我编写了一个期望异常的JUnit测试方法,如下所示:(数学是我写的类的实例)
@Test(expected = NumberFormatException.class)
public void testAdd_String() {
System.out.println("testing add number to string");
double result = math.add("lakd", "2");
}
现在我想测试的方法:
public double add(String operand1, String operand2) {
int num1 = Integer.parseInt(operand1);
int num2 = Integer.parseInt(operand2);
return num1 + num2;
}
当我在方法标题上有throws NumberFormatException
时,以及当它没有时,我的测试都通过了。这是预期的行为还是JUnit?有没有办法通过JUnit测试来确保我的方法中存在throws子句?
答案 0 :(得分:2)
将throws
添加到方法声明只是一个警告标签,说“看,我可以随时抛出此异常!你最好为此做好准备。”您只在实际使用throw
语句时抛出异常,或者您调用的方法使用throw
语句。
NumberFormatException
是运行时异常或未经检查的异常(RuntimeException
的子类),因此永远不需要在使用的方法上声明它throws
。您仍然可以在try / catch块中捕获它,但与已检查的异常(例如FileNotFoundException
,Exception
的子类)不同,您不需要在其上声明它抛出它的方法。
您不应该测试某个方法是否具有可以抛出的已检查异常 - 只是它是否实际抛出异常。事实上,正如您已经拥有的那样,expected
@Test
参数意味着如果您的方法停止投掷 NumberFormatException
,测试将失败,例如你改变了这一行:
double result = math.add("1", "2");
如果你觉得异常是“预期的”,那么使用你的方法的人必须有一个围绕它的try / catch块,你应该创建自己的Exception
子类 - 但要预先警告这可能使你的方法更难以干净利用。