Junit没有正确比较对象?

时间:2016-12-19 16:50:19

标签: java android junit

我在Android Studio中使用jUnit,要么我完全忽视了某些内容,要么jUnit无法正常工作......我得到了以下示例代码:

ChatContent testContent = new ChatContent(new ArrayList<ChatMessage>());
ChatContent testContent2 = new ChatContent(new ArrayList<ChatMessage>());
assertThat(testContent, equalTo(testContent2));

当我运行测试时,我收到错误消息

  

java.lang.AssertionError:   预期:[...]。ChatContent @ 7fbe847c        但是:是[...]。ChatContent @ 41975e01   预期:[...]。ChatContent @ 7fbe847c

     

实际:[...]。ChatContent @ 41975e01

这不应该发生,因为equalTo()只测试相等而不是像==这样的 true 相等,对吗?

ChatContent基本上只是一个包含List<ChatMessage>实例的类,它没有做其他事情。

我目前在我的项目中使用jUnit,Mockito和Hamcrest(都是最新的)。

2 个答案:

答案 0 :(得分:1)

你应该阅读你正在使用的电话的Javadoc,就像这里的equalTo一样:

创建一个匹配器,当被检查对象在逻辑上等于指定的操作数时匹配,通过在被检查对象上调用Object.equals(java.lang.Object)方法来确定。

所以,正如预期的那样:不正确的不是JUnit或Hamcrest。什么不正确是您的假设。您假设equalTo()与==相同。当你的观察与你的期望不符时;你认为现实已经破裂,而不是质疑你自己的假设

提示:大多数时候,情况恰恰相反。

从这个意义上讲,答案是:覆盖equals()和hashCode()。或者决定你不需要像这样的测试。两种方式都有效;这取决于你的背景,哪一个更适合你。

答案 1 :(得分:0)

Hamcrest equalTo方法默认调用Object.equals()方法(在你的情况下是ChatContent.equals())我同意khelwood你必须覆盖.equals以获得你想要的行为,但是因为你&#39 ;使用Hamcrest,我建议使用CustomMatcher。

http://www.planetgeek.ch/2012/03/07/create-your-own-matcher/

相关问题