mockito中的测试失败消息:参数不同!通缉:

时间:2014-08-09 00:00:11

标签: junit mockito

我正在测试我的JUnit中的Restful端点并获取如下的异常 列表在save方法中作为参数出现,

**"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]
 ); 

当我调试代码时,代码在下面的验证行中断开并抛出了 以上例外。看起来像" 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);
}

2 个答案:

答案 0 :(得分:29)

实现Object#equals(Object)可以通过相等比较来解决它。尽管如此,有时您正在验证的对象无法更改,或者无法实现其equals功能。对于这种情况,建议使用org.mockito.Matchers#refEq(T value, String... excludeFields)。所以你可以使用类似的东西:

verify(programServiceMock, times(1)).save(id, refEq(testpPList));

只需用refEq包装参数即可解决问题。

答案 1 :(得分:20)

确保在equals中实施com.domain.PP方法。

<强> [编辑]

这个结论的原因是你失败的测试消息表明它希望这个PP

列表
[com.domain.PP@6809cf9d, com.domain.PP@5925d603]

但它获得了PP列表

[com.domain.PP@5b6e23fd, com.domain.PP@1791fe40]

每个@对象的PP符号后面的十六进制值是它们的哈希码。因为它们不同,所以它表明它们属于不同的对象。因此,equals的默认实现会说它们不相等,这是verify()使用的。

在实现hashCode()时同时实现equals()是一种很好的做法:根据hashCode的定义,两个相等的对象必须具有相同的hashCodes。这可以确保像HashMap这样的对象可以使用hashCode不等式作为对象不等式的快捷方式(这里,将具有不同hashCodes的对象放在不同的桶中)。