我在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(都是最新的)。
答案 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/