Java测试被零除

Java测试被零除,java,Java,我试图测试除以零的功能 如果我只做:System.out.println(5/0),我将得到java.lang.arithmetricexception 我正在尝试测试是否引发了异常 下面是我的单元测试: @Test(expected = ArithmeticException.class) public void given_divideByZeroInput_when_divideByZero_then_verify_throwing_exception() { M

我试图测试除以零的功能

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

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

下面是我的单元测试:

 @Test(expected = ArithmeticException.class)
    public void given_divideByZeroInput_when_divideByZero_then_verify_throwing_exception() {
        MathClass sut = new MathClass();
        sut.div(10,0);
    }
我的
div
很简单:

 public float div(int x, int y) {
        return (float) x/y;
    }
但是,单元测试失败,说明:

java.lang.AssertionError: Expected exception: java.lang.ArithmeticException
我做错了什么


我知道有很多方法可以测试抛出的异常,但我试图坚持使用简单的
@test(excepted=…)
JB Nizet找到了答案:


你把x投到一个浮球上。因此,您并没有像在第一个代码段中那样进行整数除法,而是进行浮点除法。因此,结果是无限的,而不是例外

但还有更多的原因需要解释:

    return (float) x/y;
意味着

  • x
    转换为
    float
  • 使用浮点运算执行
    ((float)x)/y
    计算
  • 返回值
  • 移除铸件时:

        return x/y;
    
    意味着

  • 使用整数运算执行
    x/y
    计算
  • 将值转换为浮点(隐式!)
  • 返回值
  • 所以实际上有很多(潜在的)概念错误可能会导致你犯的错误

    • 类型转换的优先级高于
      /
    • 使用32位浮点算法执行涉及
      int
      float
      的算术运算。(将
      int
      操作数加宽为
      float
    • 加宽也发生在“赋值上下文”中,
      return
      语句就是赋值上下文

    您是否可以提供完整的堆栈跟踪。您正在将x投射到浮点。因此,您并没有像在第一个代码段中那样进行整数除法,而是进行浮点除法。因此,结果是
    无穷大
    ,而不是异常。与其使用
    @expected
    ,不如尝试在测试方法中使用
    try catch
    ,以捕获预期异常。如果可以的话,我建议在JUnit4或junit5中使用
    ExpectedException
    规则equivalent@JBNizet哦,是的,你是对的,删除(float)解决了它,谢谢你的代码没有抛出异常,但运行时是,那么你到底在测试什么呢?为JavaVM编写单元测试没有多大意义。