11

目前我正在做一些代码审查,我发现这行代码会中断测试用例:

assertEquals(Long.valueOf(4321), lMessage.getNumber());

getNumber返回一个Integerwhich 也是4321. 我把它改成这样:

assertTrue(4321 == lSavedStoerung.getMessage());

因为在我对 equals 方法的理解中,assertEquals在第一个示例中永远不会返回 true。我的assertTrue所有测试用例都运行良好。

还是我理解错了?

4

2 回答 2

22

测试失败的原因assertEquals是相等性不仅考虑了数字的值,还考虑了它的类型。java.lang.Longobject 不equal与 a比较java.lang.Integer

由于lMessage.getNumber()返回一个int,JavaInteger在传递给 之前将其包装成assertEquals。这就是为什么您可以通过使用来修复测试用例Integer.valueOf

assertEquals(Integer.valueOf(4321), lMessage.getNumber());
于 2013-07-04T10:53:56.707 回答
1

4321做多的原因是什么?如果没有必要,请使用 dasblinkenlight 建议的整数解决方案。

assertEquals(Integer.valueOf(4321), lMessage.getNumber());

或者

assertEquals(4321, lMessage.getNumber());

另一方面,如果您的代码允许lMessage.getNumber()根据具体情况返回 long,那么您可以将其装箱为 long 以供您的测试。

assertEquals(Long.valueOf(4321), (long) lMessage.getNumber());

PS:使用 assertTrue & == 变得过于舒适,如果你比较一些不属于原始数据类型的东西,会给你带来麻烦,但在这个特定的例子中不会。

于 2013-07-04T11:07:00.217 回答