我有一个分为两个数字的班级。当一个数除以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);
}
}
我的实际代码是不同的,因为它有很多依赖项,我简化了我对这个示例测试的要求。请建议。
答案 0 :(得分:2)
divide
不会抛出此异常。
您的选择
您可以像这样使用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类时传递。