JUnit不检测ArithmeticException

时间:2014-09-02 11:07:23

标签: java junit

我正在练习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中测试这种行为?

3 个答案:

答案 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整除的浮点数始终是无穷大。因此你永远不会得到算术异常。