Java测试除以零

Jac*_*son 2 java

我正在尝试测试零除的功能。

如果我只是做:System.out.println(5/0),我会得到java.lang.ArithmeticException

我正在尝试测试是否引发了异常。

这是我的单元测试:

 @Test(expected = ArithmeticException.class)
    public void given_divideByZeroInput_when_divideByZero_then_verify_throwing_exception() {
        MathClass sut = new MathClass();
        sut.div(10,0);
    }
Run Code Online (Sandbox Code Playgroud)

我的div就是这么简单:

 public float div(int x, int y) {
        return (float) x/y;
    }
Run Code Online (Sandbox Code Playgroud)

但是,单元测试失败,说明:

java.lang.AssertionError: Expected exception: java.lang.ArithmeticException
Run Code Online (Sandbox Code Playgroud)

我做错什么了?

我知道有很多方法可以测试抛出的异常,但是我试图坚持简单的方法 @Test(excepted = .. )

Ste*_*n C 7

JB Nizet找到了答案:

您正在将x强制转换为浮点数。因此,您没有像在第一个代码片段中那样进行整数除法,而是进行了浮点除法。结果就是无限,也不例外。

但是还有更多要解释的东西:

    return (float) x/y;
Run Code Online (Sandbox Code Playgroud)

手段

  1. 转换xfloat
  2. ((float) x) / y使用浮点算法执行计算
  3. 返回值

删除演员表时:

    return x/y;
Run Code Online (Sandbox Code Playgroud)

手段

  1. x/y使用整数算术执行计算
  2. 将值转换为浮点数(隐式!)
  3. 返回值

因此,实际上存在许多(潜在的)概念性错误,这些错误可能导致您犯了错误。

  • 类型转换的优先级高于/
  • 使用32位浮点算术执行包含an int和a的float算术运算。(int操作数将扩大为float
  • 扩展也发生在“分配上下文”中,return语句是分配上下文。