我创建了一个类并重写了equals()方法。当我使用assertTrue(obj1.equals(obj2))
时,它会通过测试;但是,assertEquals(obj1, obj2)
将无法通过测试。有人可以告诉原因吗?JUnit assertEquals()对两个对象失败
回答
我的猜测是,你有没有实际上覆盖equals
- 你已经超载它来代替。在编译时使用@Override
注释来找出这种东西。
换句话说,我怀疑你有:
public boolean equals(MyClass other)
,你应该有:
@Override // Force the compiler to check I'm really overriding something
public boolean equals(Object other)
在你的工作断言,你无疑调用重载方法obj1
和obj2
的编译时间类型都是MyClass
(或不管你的类被称为)。 JUnit的assertEquals
只会呼叫equals(Object)
,因为它不知道更好。
它在我将公共布尔等于(MyClass其他)更改为公共布尔等于(对象其他)时起作用。谢谢乔恩。 – 2011-05-19 15:33:03
@nikel:'Date'是可变的,这使得很难很好地实现平等 - 你可以有一个'HashSet
重新添加评论 - 我想知道为什么日期不会覆盖其等于执行... – nikel 2015-05-13 10:41:34
这里是assertEquals
代码(从Github):
static public void assertEquals(String message, Object expected,
Object actual) {
if (expected == null && actual == null)
return;
if (expected != null && isEquals(expected, actual))
return;
else if (expected instanceof String && actual instanceof String) {
String cleanMessage= message == null ? "" : message;
throw new ComparisonFailure(cleanMessage, (String) expected,
(String) actual);
} else
failNotEquals(message, expected, actual);
}
private static boolean isEquals(Object expected, Object actual) {
return expected.equals(actual);
}
我能想到的只有一个情况下这种行为你描述的方式 - 如果你的equals
方法不正确处理攀比null
值。
你假设JUnit调用的'equals'与传入版本中调用的'equals'是一样的...... – 2011-05-19 15:23:54
@Jon是的,只是注意到你已经正确地猜到了这个问题。 – 2011-05-22 06:52:46
- 1. 的JUnit的assertEquals失败
- 2. 对象持久化后Hibernate assertEquals失败
- 3. 当比较两个对象时,JUnit assertEquals()不起作用
- 4. 失败的assertEquals两个矢量
- 5. 使用assertEquals时发生意外的JUnit测试失败
- 6. assertEquals()失败的原因
- 7. 失败的assertEquals两个看似相同的字符串
- 8. Junit测试用例对抽象方法失败
- 9. Javascript日期对象失败
- 10. 对象范围失败
- 11. 创建对象“wscript.shell”失败
- 12. JS:对象迭代失败
- 13. 创建对象失败ELEMRIDXNOTFOUND
- 14. 对象的Assert.AreEqual()失败
- 15. Server.Create对象失败错误
- 16. c#对象比较失败
- 17. Java的两个Set对象 - hashCode()是相同的,但.equals()失败
- 18. 插入两个相关的对象在SQLAlchemy中失败
- 19. 两个ActiveSupport :: TimeWithZone对象之间的比较失败
- 20. 当减去两个日期时间对象tostring失败
- 21. C++分配另一个对象的对象值失败
- 22. 如果一个对象失败所有对象回滚
- 23. JUnit TestCase失败
- 24. JUnit - IllegalArgumentException.class失败?
- 25. assertEquals比较对象id而不是对象的内容?
- 26. 是否的assertEquals(对象01,对象02)使用equals方法
- 27. junit模拟对象
- 28. JUnit,比较对象
- 29. 有两种方法的jUnit失败
- 30. 当对象B失败时,如何使对象A失败验证
我们需要看到equals方法的代码 – hvgotcodes 2011-05-19 15:18:13
'obj1'和'obj2'是同一类型吗? – 2011-05-19 15:18:39
您是否在调试模式下尝试使用assertEquals重写的相等值? – VirtualTroll 2011-05-19 15:19:15