如何断言异常被捕获?

时间:2014-09-10 08:56:06

标签: java junit exception-handling

我知道如何断言抛出异常。但是,我如何断言抛出异常并成功捕获?例如,假设我有一个方法应该为无效输入抛出特定类型的异常

public static void myMethod(String value) {
    try {
        someExternalMethod(value);// can throw IllegalArgumentException
    } catch (IllegalArgumentException e) {
        System.out.println("Let me handle it differently");
    } catch (Exception e) {
        System.out.println("Not IllegalArgumentException");
    }
}

现在我想断言,对于某些值,该方法确实抛出了'IllegalArgumentException'而不是其他一些异常。

4 个答案:

答案 0 :(得分:1)

您错过了单元测试的重点 - 测试应该测试行为,而不是实现

鉴于此假设,您应该在myMethod发生时测试IllegalArgumentException的行为是否符合预期。对于给定参数的方法,很难说除了那个,String是不可变的,没有返回值,也没有抛出异常。

一个更好的例子可能是这种方法(这有点用来证明这一点):

public double divide(int numerator, int denominator)
{
  try
  {
    return numerator / denominator;
  }
  catch (ArithmeticException e)
  {
    return Double.NaN;
  }
}

你的测试会断言除法是正确的,并且当发生错误时{1}}被返回,如下所示:

NaN

然后你可以像这样重写@Test public void testDivide() { assertEquals(2.0, divide(4, 2), 0); } @Test public void testDivideByZero() { assertTrue(Double.isNaN(divide(1, 0)); } 方法:

divide

测试将确认我的系统的运行,因为public double divide(int numerator, int denominator) { if (denominator == 0) { return Double.NaN; } else { return numerator / denominator; } } 方法的行为保持不变。

答案 1 :(得分:0)

catch块按它们的顺序进行评估。

您的代码运行正常:如果IllegalArgumentExceptionException阻止将被忽略。

答案 2 :(得分:0)

在测试myMethod的情况下,您不能(更重要的是,您不应该)检查someExternalMethod是否已抛出IllegalArgumentException。实际上,您对myMethod的测试不应假设已调用someExternalMethod:它是myMethod的实现细节。

myMethod捕获这些异常的原因是将它们隐藏在呼叫者之外。您应该通过传递导致它们的值来检查这些异常是否对您隐藏,并验证在这两种情况下都不会抛出任何内容。

测试someExternalMethod及其引发的异常是通过测试someExternalMethod完成的任务,而不是myMethod

答案 3 :(得分:0)

  1. 模拟方法someExternalMethod(value)强行抛出Exception
  2. 测试方法myMethod,检查没有抛出异常:

    @Test
    public void testMyMethod() {
       try {
          myMethod("value");
       } catch (Exception ex) {
          Assert.fail();
       }
    }