我正在练习JUnit,这是我想要测试的简单方法
public float divide(int a, int b){
return (float)a/(float)b;
}
这是测试(数学只是我的一个包含该方法的自定义类):
@Test(expected = ArithmeticException.class )
public void divideByZeroShouldBeDetected(){
Maths m = new Maths();
m.divide(2,0);
}
无论如何运行此测试会导致失败......
编辑: 好吧,只是检查一下"奇怪",这段代码实际上给了我例外:
float c = 2/0;
无论如何这个:
m.divide(2,0);
给了我
Infinity
这就是测试失败的原因。那么..如何在Junit中测试这种行为?
答案 0 :(得分:2)
Ok解决了....问题是关于参数的类型,在这篇文章中你可以找到一个完整的解释Java division by zero doesnt throw an ArithmeticException - why?。
为了进行测试我只需断言返回的值是"无限",这样:
@Test
public void divideByZeroShouldBeDetected(){
Maths m = new Maths(2, 0);
assertEquals("divide float by zero should be infinity", true, Float.isInfinite(m.divide()));
}
答案 1 :(得分:2)
而且,
为了澄清,ArithmeticException仅针对整数而不针对浮点数抛出。
package com.ey.buildmap;
public class test
{
public static void main(String[] args) {
try
{
//System.out.println(3/0);
System.out.println((float)5/(float)0);
}
catch(ArithmeticException e)
{
e.printStackTrace();
}
}
}
我的意思是,在上面的例子中, 的System.out.println(3/0); 将抛出ArithmeticException,而下一行赢了,因为结果将是Infinity。
答案 2 :(得分:1)
我认为在Maths类中你的除法方法通过这个测试用例是不正确的。
因为可被0或0.0整除的浮点数始终是无穷大。因此你永远不会得到算术异常。