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精确匹配对象实例的主要内容,如果未能解决你的问题,请参考以下文章