有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    我认为你在数学课上的划分方法不正确,不能通过这个测试

    因为可以被0或0.0整除的浮点数总是无穷大。因此,您永远不会得到算术异常

  2. # 2 楼答案

    而且

    为了澄清,算术异常只针对整数而不是浮点抛出

    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();
            }
        }
    }
    

    我的意思是,在上面的例子中, 系统出来println(3/0); 将抛出算术异常,而下一行不会抛出,因为结果将是无穷大

  3. # 3 楼答案

    好的,解决了。。。。问题是关于参数的类型,在这篇文章中你可以找到一个完整的解释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()));
    }