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

Tom*_*ris 17 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]
 ); 
Run Code Online (Sandbox Code Playgroud)

当我调试代码时,代码在下面的验证行中断开并引发了上述异常.看起来save方法中"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);
}
Run Code Online (Sandbox Code Playgroud)

控制器方法:

@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);
}
Run Code Online (Sandbox Code Playgroud)

Eli*_*iuX 35

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

verify(programServiceMock, times(1)).save(id, refEq(testpPList));
Run Code Online (Sandbox Code Playgroud)

只是包装参数refEq解决问题.

  • 真棒的答案!! 为我工作.语法如下:verify(serviceName).methodCall(refEq(passedParameter)); (3认同)

fgb*_*fgb 21

确保您实现了该equals方法com.domain.PP.

[编辑]

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

[com.domain.PP@6809cf9d, com.domain.PP@5925d603]
Run Code Online (Sandbox Code Playgroud)

但它正在获得这份PP清单

[com.domain.PP@5b6e23fd, com.domain.PP@1791fe40]
Run Code Online (Sandbox Code Playgroud)

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

这是很好的做法,也能实现的hashCode()每当你实现equals()方法:根据hashCode的定义,两个对象是相等的必须具有相同的哈希码.这确保了像HashMap这样的对象可以使用hashCode不等式作为对象不等式的快捷方式(这里,将具有不同hashCodes的对象放在不同的桶中).

  • 这是对这个问题的一个很好的解释.但这需要更改java代码才能运行成功的JUnit测试.而不是在java类中实现equals方法还有其他优雅的解决方案吗? (3认同)