带有 scala 的 mockito:匹配器问题

Posted

技术标签:

【中文标题】带有 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)))

【讨论】:

以上是关于带有 scala 的 mockito:匹配器问题的主要内容,如果未能解决你的问题,请参考以下文章

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

用于 PC Mockito 模拟验证的自定义 Hamcrest 匹配器

带有路径变量和蚂蚁匹配器的 Spring Security 自定义方法

怎样在scala正则表达式提取器中使用小括号

Mockito:等待与参数匹配的调用

Mockito的参数匹配