在Junit中捕获抛出的异常而没有Throwable阻止吞咽它

时间:2016-02-19 23:29:02

标签: java junit4

我有一个分为两个数字的班级。当一个数除以0时,它会抛出ArithmeticException。但是当我对它进行单元测试时,在控制台上显示抛出了ArithmeticException,但是我的测试失败了AssertionError。我想知道是否有办法证明它在Junit中抛出ArithmeticException?
Example.java

public class Example {

public static void main(String[] args)
{
    Example ex = new Example();
    ex.divide(10, 0);
}

public String divide(int a, int b){
    int x = 0;
    try{
        x = a/b;
    }
    catch(ArithmeticException e){
        System.out.println("Caught Arithmetic Exception!");
    }
    catch(Throwable t){
        System.out.println("Caught a Different Exception!");
    }
    return "Result: "+x;
}
}

ExampleTest.java

public class ExampleTest {
    @Test(expected=ArithmeticException.class)
    public void divideTest()
    {
        Example ex = new Example();
        ex.divide(10, 0);
    }
}

我的实际代码是不同的,因为它有很多依赖项,我简化了我对这个示例测试的要求。请建议。

4 个答案:

答案 0 :(得分:2)

divide不会抛出此异常。

您的选择

  • 提取try / catch的内部部分作为可以从单元测试中调用的方法。
  • 在单元测试中捕获System.err并检查它是否尝试打印出您期望的错误。

您可以像这样使用IDE提取方法

public static String divide(int a, int b){
    int x = 0;
    try{
        x = divide0(a, b);
    }
    catch(ArithmeticException e){
        System.out.println("Caught Arithmetic Exception!");
    }
    catch(Throwable t){
        System.out.println("Caught a Different Exception!");
    }
    return "Result: "+x;
}

static int divide0(int a, int b) {
    return a/b;
}

@Test(expected = ArithmeticException.class)
public void testDivideByZero() {
    divide0(1, 0);
}

答案 1 :(得分:1)

您获得AssertionError因为预期的异常ArithmeticException没有被测试方法抛出。您需要让ArithmeticException传播出要测试的方法divide。不要抓住它。不要在divide中抓到任何内容。

答案 2 :(得分:1)

JUnit没有捕获异常,因为您已经在方法中捕获了异常。如果删除"除去"中的try catch块,JUnit将捕获算术异常并且您的测试将通过

答案 3 :(得分:1)

你的divide()方法正在捕获ArithmeticException但没有对它做任何事情(除了打印到它被捕获的控制台)。如果divide()方法应该抛出ArithmeticException,那么你有两个选择:

  • 删除divide()方法中的try / catch。一旦你试图除以0,它将自动抛出ArithmeticException,你的测试用例将在接收到预期的Exception类时传递。
  • 或者,在向控制台打印到捕获到ArithmeticException之后,抛出该异常备份到调用方法。