Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在Scala中使用Mockito ArgumentMatchers_Scala_Mockito - Fatal编程技术网

无法在Scala中使用Mockito ArgumentMatchers

无法在Scala中使用Mockito ArgumentMatchers,scala,mockito,Scala,Mockito,我用的是ScalaMock和Mockito 我有这个简单的代码 class MyLibrary { def doFoo(id: Long, request: Request) = { println("came inside real implementation") Response(id, request.name) } } case class Request(name: String) case class Response(id: Long, na

我用的是ScalaMock和Mockito

我有这个简单的代码

class MyLibrary {
   def doFoo(id: Long, request: Request) = {
      println("came inside real implementation")
      Response(id, request.name)
   }
}

case class Request(name: String)
case class Response(id: Long, name: String)
我可以使用此代码轻松地模拟它

val lib = new MyLibrary()
val mock = spy(lib)
when(mock.doFoo(1, Request("bar"))).thenReturn(Response(10, "mock"))
val response = mock.doFoo(1, Request("bar"))
response.name should equal("mock")
但是如果我把代码改成

val lib = new MyLibrary()
val mock = spy(lib)
when(mock.doFoo(anyLong(), any[Request])).thenReturn(Response(10, "mock"))
val response = mock.doFoo(1, Request("bar"))
response.name should equal("mock")
我看到它进入了真正的实现,并得到一个空指针异常。

试试这个

doReturn(Response(10, "mock"), null.asInstanceOf[Array[Object]]: _*).when(mock.doFoo(anyLong(), any[Request]))

我很确定它也在真正的实现中,没有匹配器,区别在于它在这种情况下不会崩溃(
any
最终将null传递到调用中)

在编写
When(mock.doFoo(…)
时,编译器必须调用
mock.doFoo
来计算在
时传递给
的参数

使用
mock
执行此操作是可行的,因为所有实现都是存根的,但是
spy
围绕实际对象,因此,实现也是真实的

间谍在莫基托的世界里是不受欢迎的,而且被认为是代码气味。 如果您发现自己必须模拟类的某些功能,同时保留其其余部分,那么几乎可以肯定的是,您应该将其拆分为两个单独的类。然后您就可以完全模拟整个“底层”对象,而不需要对事物进行监视

如果你出于某种原因仍在使用间谍,
doReturn
将是解决办法,正如另一个答案所示。您不应该将
null
作为vararg参数传递,因为它会更改调用的语义。像这样的方法应该会奏效:

 doReturn(Response(10, "mock"), Array.empty:_*).when(mock).doFoo(any(), any())

但是,我要再次强调:这只是一个权宜之计。正确的解决方案是首先使用
mock
而不是
spy

错误:(24,10)对重载定义的引用不明确,类型为(x$1:Any,x$2:object*)org.Mockito.stubing的对象Mockito中的方法doReturn和类型为(x$1:Any)的对象Mockito中的方法doReturnorg.mockito.stubing.Stubber匹配参数类型(com.abhi.Response)doReturn(Response(10,“mock”)).when(mock.doFoo(anyLong(),any[Request])
根据这一点:这是已知的scala问题。票上说他们会在某个时候修好的。你使用最新版本的scala吗?我现在只能使用2.11。我改为丑陋的版本来解决这个问题。它不起作用。我在这里签入了我的代码,其中包含了上面的版本。行'doReturn(Response(10,“mock”)、Array.empty:u.when(.when(mock.doFoo(any,any))`未编译。我将其更改为'doReturn(Response(10,“mock”)、Array.empty:u.when(mock.doFoo(any,any))`但它仍然不编译。下划线后需要是星号。它对我来说编译得很好(删除多余的。
when
:)您遇到了什么错误?
doReturn(Response(10,“mock”)、Array.empty:*)。when(mock.doFoo(any,any))
抛出一系列编译器错误
error:(24,73)多态表达式无法实例化为预期类型;发现:[T]()T必需:长doReturn(响应(10,“模拟”),数组.空:*)。当(mock.doFoo(任意,任意))
ah。。。您需要
()
在任何之后。抱歉(更新答案)。好的,再次修复。。。现在试试看。但说真的,这让人困惑是有原因的。真正的解决办法就是不要使用间谍。