【问题标题】:Simple use of Mockito AnyMap is not working简单使用 Mockito AnyMap 不起作用
【发布时间】:2017-05-03 01:17:49
【问题描述】:

在这种简单的情况下,为什么 anyMap 在这里不起作用?我得到 func1 无法与此签名匹配?

case class foo() {def func1 (m: Map[Int, Int]) = m.size }

case class SomeTest extends SomeSpec MockitoSugar with MustMatchers {
   it("checks size ") { fixture =>
      val spyfoo = spy(foo())
      doReturn(5).when(spyfoo).func1(anyMap())}

我得到这个签名无法识别 func1

【问题讨论】:

    标签: scala mockito scalatest


    【解决方案1】:

    免责声明;我不使用 ScalaTest,但看起来 Mockito 功能是按原样提供的,您应该能够使用 Matchers 类中的任何内容。

    但是提供的 anyMap()anyMapOf[K,V] 函数是 java.util.Map 的匹配器,因此不会匹配您的 func1 方法签名(除非您明确引入了 @987654328 @) 期待scala.collection.immutable.Map[Int,Int]

    解决这个问题的最简单方法似乎是使用通用的 any[T] 匹配器,它非常松散,但可以满足您的需要。

    还有更多的问题 - 为什么你spy()ing 在你拥有的对象上?当它接受 Map 并返回Int 时,您为什么要返回 Mapfunc1 的模拟行为中?

    这对我来说是编译和工作的:

    import org.mockito.{Matchers, Mockito}
    
    val mockFoo = Mockito.mock(classOf[Foo])
    
    Mockito.when(mockFoo.func1(Matchers.any(classOf[Map[Int, Int]]))).thenReturn(1)
    
    ...
    

    【讨论】:

    • 监视对象;值得商榷,但我认为部分模拟有其用例。就我而言:我正在调用外部 [无法控制类型],并且我想测试我是否将正确的参数传递给它。至于返回 Map => 留下错字,已更正
    • 我也相信对于间谍,Mockito 建议 doReturn(n).when(mockfoo).func1(Matchers.any(classOf[Map[Int, Int]])) 而不是 "when.. doReturn"
    猜你喜欢
    • 2013-05-31
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2011-12-02
    • 2019-01-11
    相关资源
    最近更新 更多