【问题标题】:JUnit does not detect ArithmeticExceptionJUnit 未检测到 ArithmeticException
【发布时间】:2014-09-02 11:07:23
【问题描述】:

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

【问题讨论】:

  • 这是哪门数学课?
  • 一个我自己做的自定义类,抱歉我更新了

标签: java junit


【解决方案1】:

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

【讨论】:

    【解决方案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。

    【讨论】:

      【解决方案3】:

      我认为 Maths 类中的除法方法不正确,无法通过这个测试用例。

      因为可被 0 或 0.0 整除的浮点数始终为无穷大。因此您永远不会遇到算术异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-25
        • 2021-07-07
        • 2018-07-12
        • 2013-12-02
        • 2023-03-13
        • 2020-04-11
        • 1970-01-01
        相关资源
        最近更新 更多