我正在我的JUnit中测试Restful端点,并获得如下所示的异常列表,该列表作为保存方法
的参数存在。**"Argument(s) are different! Wanted:"**
save(
"121",
[com.domain.PP@6809cf9d,
com.domain.PP@5925d603]
);
Actual invocation has different arguments:
save(
"121",
[com.domain.PP@5b6e23fd,
com.domain.PP@1791fe40]
);
当我调试代码时,代码在下面的verify行出错,抛出了错误以上异常。看起来像保存中的"testpPList"中的参数方法不同。我不知道当我在我的JUNit正确,然后调用RestFul URL。
请求您的宝贵意见。谢谢。
代码:@Test
public void testSelected() throws Exception {
mockMvc.perform(put("/endpointURL")
.contentType(TestUtil.APPLICATION_JSON_UTF8)
.content(TestUtil.convertObjectToJsonBytes(testObject)))
.andExpect(status().isOk());
verify(programServiceMock, times(1)).save(id, testpPList);
verifyNoMoreInteractions(programServiceMock);
}
控制器方法:@RequestMapping(value = "/endpointURL", method = RequestMethod.PUT)
public @ResponseBody void uPP(@PathVariable String id, @RequestBody List<PPView> pPViews) {
// Code to construct the list which is passed into the save method below
save(id, pPList);
}
实现Object#equals(Object)
可以通过相等比较来解决。尽管如此,有时您正在验证的对象不能更改,或者它的equals
函数不能实现。对于这种情况,建议使用org.mockito.Matchers#refEq(T value, String... excludeFields)
。所以你可以这样写:
verify(programServiceMock, times(1)).save(id, refEq(testpPList));
用refEq
包装参数就解决了问题。
确保在com.domain.PP
中实现equals
方法。
[编辑]
得出这个结论的原因是您失败的测试消息声明它期望PP
[com.domain.PP@6809cf9d, com.domain.PP@5925d603]
但是它得到了这个PP列表
[com.domain.PP@5b6e23fd, com.domain.PP@1791fe40]
每个PP
对象的@
符号后的十六进制值是它们的哈希码。因为它们是不同的,那么它就表明它们属于不同的对象。所以equals的默认实现会说它们不相等,这就是verify()
使用的。
当你实现equals()时,最好也实现hashCode():根据hashCode的定义,两个相等的对象必须具有相等的hashCode。这确保了像HashMap这样的对象可以使用hashCode不等式作为对象不等式的快捷方式(在这里,将具有不同hashCode的对象放在不同的桶中)。