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

Junit mockito中的测试失败消息:参数不同!通缉:,junit,mockito,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@179

我正在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]
 ); 
当我调试代码时,代码在下面的verify行中断,并抛出 上述例外。看起来像保存中的“testpPList”中的参数 方法不同。我不知道当我在我的生活中构建它们时,它是如何变得不同的 JUNit,然后调用RestFul URL

请求您的宝贵意见。谢谢

代码:

控制器方法:

@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);
}
@RequestMapping(value=“/endpointURL”,method=RequestMethod.PUT)
public@ResponseBody void uPP(@PathVariable String id,@RequestBody List pPViews){
//用于构造传递到下面save方法中的列表的代码
保存(id,pPList);
}

确保在
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()
所使用的


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

实现
对象#等于(object)
可以通过等式比较来解决它。尽管如此,有时您正在验证的对象无法更改或其
equals
功能无法实现。对于这种情况,建议使用
org.mockito.Matchers#refEq(T值、字符串…排除字段)
。因此,您可以使用以下内容:

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

refEq
包装参数就可以解决问题。

这是对问题的一个很好的解释。但这需要更改java代码才能成功运行JUnit测试。除了在java类中实现equals方法之外,还有其他优雅的解决方案吗?答案太棒了!!为我工作。语法如下:verify(serviceName).methodCall(refEq(passedParameter));我试过了,但在我的例子中它说:
java.lang.IllegalStateException:Mockito.refEq(transactionToAdd)不能为null
@Idegod您的变量
transactionToAdd
似乎为null,这就是它失败的原因。@EliuX,是的,但这是因为可为null对象上的Kotlin/java关系(通过解析)
verify(programServiceMock, times(1)).save(id, refEq(testpPList));