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
无穷大
,而不是异常。与其使用@expected
,不如尝试在测试方法中使用try catch
,以捕获预期异常。如果可以的话,我建议在JUnit4或junit5中使用ExpectedException
规则equivalent@JBNizet哦,是的,你是对的,删除(float)解决了它,谢谢你的代码没有抛出异常,但运行时是,那么你到底在测试什么呢?为JavaVM编写单元测试没有多大意义。