目前我正在进行一些代码审查,我发现这行代码中断了测试用例:
assertEquals(Long.valueOf(4321), lMessage.getNumber());
getNumber
会返回Integer
,也是4321
。
我改成了这个:
assertTrue(4321 == lSavedStoerung.getMessage());
因为在我对equals方法的理解中,assertEquals
在第一个例子中永远不会返回true。我的assertTrue
所有测试用例运行正常。
或者我理解错了什么?
答案 0 :(得分:14)
assertEquals
测试失败的原因是,等式不仅考虑了数字的值,还考虑了它的类型。 java.lang.Long
对象与equal
的{{1}}不进行比较。
由于java.lang.Integer
返回lMessage.getNumber()
,因此Java会在传递给int
之前将其包装到Integer
。这就是为什么你可以使用assertEquals
来修改测试用例:
Integer.valueOf
答案 1 :(得分:1)
4321长期背后的原因是什么?如果没有必要使用整数解决方案dasblinkenlight sugested。
assertEquals(Integer.valueOf(4321), lMessage.getNumber());
或
assertEquals(4321, lMessage.getNumber());
另一方面,如果您的代码允许lMessage.getNumber()
根据具体情况返回很长时间,那么您可以将其打包成一个长的测试。
assertEquals(Long.valueOf(4321), (long) lMessage.getNumber());
PS:使用assertTrue& ==如果您比较一些原始数据类型中没有的东西会导致您遇到麻烦,但在这个具体示例中它不会。