mockito doReturn精确匹配对象实例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mockito doReturn精确匹配对象实例相关的知识,希望对你有一定的参考价值。

参考技术A 在mockito中我们mock某个对象的行为时,可以使用doReturn when句法

被mock对象的行为默认参数只提供了anyInt(),anyString(),anyChar()等基础类型对象,当然我们也可以直接提供基础类型变量比如1,2,3,"string"等来进行精确行为定制。
但如果我们想mock的对象的行为参数类型是自定义类型,比如

我的原意是想list调用get时并且get参数是A类型,并且id为1,name为Anni的时候才会返回mockedList。但是这里的参数实例是新new的a,list实际调用的时候即使传入的是A的实例,并且id和name与a相同,但依然是两个不同的实例对象,对象地址不同,所以他们即使内容相同也不会匹配,想让他们匹配,必须重写equals方法。但是,我们又不能仅仅为了测试而修改类的equals方法......

此时,我们可以通过实现ArgumentMatcher接口来完成目标:

如下使用就可以精确匹配id为1,name为Anni的对象了。

带有 scala 的 mockito:匹配器问题

【中文标题】带有 scala 的 mockito:匹配器问题【英文标题】:mockito with scala: matchers issue 【发布时间】:2022-01-23 02:05:02 【问题描述】:

我嘲笑了一项服务。服务有一个方法'action',它接受一个MyCustomObject类型的对象并返回一个Future of Either。所以模拟一下:

when(myService.action(any[MyCustomObject]())).thenReturn(any[Future[Any]]())

我在概念上没有看到任何问题。我告诉 mockito 来模拟方法操作,这样每当它被任何类型为 MyCustomObject 的对象调用时,然后让它返回 Any 的 Future,因为我不关心 Future 中的值。

但它给了我错误:

When using matchers, all arguments have to be provided by matchers.

我的两个模拟值本质上都是通用的,那么这个错误的原因是什么?

【问题讨论】:

【参考方案1】:

使用 Mockito 时,不能在 thenReturn 中传递 matcher:模拟的目的是定义任意返回值。

从概念上讲,Mockito 可能会为简单类型生成一些随机数据,但是您如何期望 Mockito 为它根本不知道的类型生成数据并且可能只接受一些特定值?

TL;DR:你必须提供一个返回值:

when(myService.action(any[MyCustomObject]()))
  .thenReturn(Future.succesfull(Right(something)))

【讨论】:

以上是关于mockito doReturn精确匹配对象实例的主要内容,如果未能解决你的问题,请参考以下文章

如何在2.7.x中使用Mockito.doReturn

PowerMock 探索

如何使用Mockito正确模拟每个循环?

Mockito 对象不是声明类的实例

等效的Answers.RETURNS_DEEP_STUBS为在mockito中的间谍

OCHamcrest 匹配器参数与验证时的 Mockito 模拟不兼容