如何解决“论点不同! Junit 和 Mockito 中的通缉犯错误

Posted

技术标签:

【中文标题】如何解决“论点不同! Junit 和 Mockito 中的通缉犯错误【英文标题】:How to fix 'Argument(s) are different! Wanted' error in Junit and Mockito 【发布时间】:2020-01-01 14:05:39 【问题描述】:

在执行涉及包含 verify.save() 方法的方法的 JUnit 测试用例时,我收到以下错误 'Argument(s) are different!通缉'

@Test
public void checkCorrectAttemptTest() 
    Multiplication multiplication = new Multiplication(50, 60);
    User user = new User("abc");
    MultiplicationResultAttempt attempt = new MultiplicationResultAttempt(user, multiplication, 3000, false);
    MultiplicationResultAttempt verifiedAttempt = new MultiplicationResultAttempt(user, multiplication, 3000, true);
    when(userRepository.findByAlias("abc")).thenReturn(Optional.empty());
    boolean attemptResult = multiplicaitonServiceImpl.checkAttempt(attempt);
    assertThat(attemptResult).isTrue();

    verify(attemptRepository).save(verifiedAttempt);

我收到以下错误消息。

Argument(s) are different! Wanted:
attemptRepository.save(
    MultiplicationResultAttempt [user=User [alias=abc], multiplication=Multiplication [factorA=50, factorB=60], resultAttempt=3000, correct=true]
);
-> at microservices.book.multiplication.service.MultiplicationServiceImplTest.checkCorrectAttemptTest(MultiplicationServiceImplTest.java:60)
Actual invocation has different arguments:
attemptRepository.save(
    MultiplicationResultAttempt [user=User [alias=abc], multiplication=Multiplication [factorA=50, factorB=60], resultAttempt=3000, correct=true]
);
-> at microservices.book.multiplication.service.MultiplicationServiceImpl.checkAttempt(MultiplicationServiceImpl.java:58)
   at microservices.book.multiplication.service.MultiplicationServiceImplTest.checkCorrectAttemptTest(MultiplicationServiceImplTest.java:60)

【问题讨论】:

【参考方案1】:

我确实在MultiplicationResultAttempt 中实现了equals 和hashcode,并且成功了!!!

【讨论】:

请编辑和格式化您的答案,使其易于阅读和理解您的解决方案。【参考方案2】:

你应该使用:

verify(attemptRepository).save(Matchers.refEq(verifiedAttempt));

我怀疑MultiplicationResultAttempt 没有基于对象字段上的相等性实现等于,因此当 Mockito 验证属性时,它不等于您提供的对象,尽管所有字段都具有相同的值。

Matcher.refEq(...) 使用反射来确定值是否相同。

编辑

正如@farhanlq 指出的Matchers.refEq(..) 已被弃用,应该使用ArgumentMatchers.refEq(...)

【讨论】:

谢谢,它有效。但是 Matchers 已被弃用。还有其他替代品吗? 是的,它们已被弃用。对不起。您可以改用 ArgumentMatchers.refEq(...)。 是的,你是对的。我没有在 MultiplicationResultAttempt 中实现 equals 方法。谢谢。 当我添加事件处理时,上面的 sn-p 不起作用。它给出了同样的错误。现在我重写了 equals 和 hashcode 方法,它工作正常。有没有其他方法可以摆脱覆盖的 equals 和 hashcode 方法?

以上是关于如何解决“论点不同! Junit 和 Mockito 中的通缉犯错误的主要内容,如果未能解决你的问题,请参考以下文章

如何解决包冲突问题

如何解决包冲突问题

如何解决ajax跨域问题

MySQL 的 10048问题,如何解决?

如何解决smartgit的冲突问题

如何解决https传输图片的问题