2012-10-15 56 views
2

我刚开始学习JUnit。我试着在别处寻找这个答案,但我找不到它。假设我写的期待异常的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

我在netbeans中使用JUnit4。 – imrandy85

回答

2

throws添加到方法声明只是一个警告标签,说:“看,我可以随时抛出此异常!您最好为它做好准备。”当您使用throw语句或者您调用的方法使用throw语句时,实际上只会抛出异常。

NumberFormatException运行时异常未经检查的异常(的RuntimeException亚类),并且因此它永远不需要使用throws的方法中声明。您仍然可以在try/catch块中捕获它,但不像已检查的例外(例如FileNotFoundException,它是Exception的子类),您不需要在该方法上声明它以引发它。

你不应该需要测试一个方法是否有一个检查的异常,它可以抛出 - 只是它是否实际抛出异常。事实上,当你拥有它已经的@Testexpected参数意味着,如果你的方法停止一个NumberFormatException,例如,如果你改变了行会导致测试失败:

double result = math.add("1", "2"); 

如果你觉得一个异常“足够”,以至于有人使用你的方法必须有一个围绕它的try/catch块,你应该创建你自己的子类Exception - 但应该预先警告,这可能会让你的方法更加干净利用。