无法在Scala中使用Mockito ArgumentMatchers
我用的是ScalaMock和Mockito 我有这个简单的代码无法在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
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。。。您需要()
在任何之后。抱歉(更新答案)。好的,再次修复。。。现在试试看。但说真的,这让人困惑是有原因的。真正的解决办法就是不要使用间谍。