我刚刚开始学习 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;
}
当我在方法 header 上抛出 NumberFormatException 以及它不存在时,我的测试都会通过。这是预期的行为还是 JUnit?有没有办法通过 JUnit 测试来确保 throws 子句存在于我的方法中?
最佳答案
在方法声明中添加 throws
只是一个警告标签,表示“看,我可以随时抛出此异常!你最好为此做好准备。”仅当您使用 throw
语句或您调用的方法使用 throw
语句时,您才会真正引发异常。
NumberFormatException
是运行时异常或未经检查的异常(RuntimeException
的子类),因此不需要在使用throws<的方法上声明它
。您仍然可以在 try/catch block 中捕获它,但与检查异常(例如 FileNotFoundException
,它是 Exception
的子类)不同,您可以不需要在方法上声明它才能抛出它。
您不需要测试方法是否具有可以抛出的已检查异常,而只需测试它是否实际抛出异常。事实上,正如您已经知道的那样,@Test
的 expected
参数意味着,如果您的方法停止抛出一个,则测试将失败>NumberFormatException
,例如,如果您将该行更改为:
double result = math.add("1", "2");
如果您认为异常是“预期”的,以至于使用您的方法的人必须有一个 try/catch block 围绕它,您应该创建自己的 Exception
子类 - 但要预先警告这可能会使您的方法更难以干净地使用。
关于unit-testing - 无论我是否抛出异常,JUnit 测试都会通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12904224/