如何在Mockito中使用条件模拟

时间:2019-06-18 15:49:35

标签: scala mockito wildcard scalatest

我有一个用模仿程序模拟的scala方法调用。

让对象为a,方法为b,方法b采用类型为Map[String, String]的参数。我想要一张符合特定条件的地图。我不知道此Map的所有键值对,但我想确保Map具有键值对,如key1-> value1key2-> value2 当我使用这样的东西

when(a.b(any[Map[String, String]])) thenReturn something

这里anyorg.mockito中的静态成员。但是我不能在这里使用它,因为Map可以使用任何键和值来满足此模拟。 在这种情况下如何实现条件模拟?

我正在寻找类似于where方法的实用程序,该方法位于 org.scalamock.matchers.Matchers

1 个答案:

答案 0 :(得分:1)

像这样尝试IdiomaticMockito中的answers

import org.scalatest._
import org.mockito.{ArgumentMatchersSugar, IdiomaticMockito}

trait Foo {
  def bar(m: Map[String, String]): String
}

class FooSpec extends FlatSpec with Matchers with IdiomaticMockito with ArgumentMatchersSugar {
  "Foo object" should "say woohoo" in {
    val foo = mock[Foo]
    foo.bar(*) answers ((m: Map[String, String]) => if (m.exists(_ == ("key1", "value1"))) "woohoo" else "boom")
    foo.bar(Map("key1" -> "value1")) should be ("woohoo")
  }
}

在这里,我们像这样将条件响应传递给answers

if (m.exists(_ == ("key1", "value1"))) "woohoo" else "boom")

请注意,除了了解Scala的具体信息外,我们还使用mockito-scala(它是香草Mockito):

libraryDependencies += "org.mockito" %% "mockito-scala" % "1.5.11"

这与香草Mockito的解决方案相同

import org.scalatest._
import org.mockito.Mockito
import org.mockito.Mockito._
import org.mockito.ArgumentMatchers._

trait Foo {
  def bar(m: Map[String, String]): String
}

class FooSpec extends FlatSpec with Matchers {
  "Foo object" should "say woohoo old syntax" in {
    val foo = Mockito.mock(classOf[Foo])
    doAnswer({ args =>
      val m = args.getArgument[Map[String, String]](0)
      if (m.exists(_ == ("key1", "value1"))) "woohoo" else "boom"
    }).when(foo).bar(any[Map[String, String]])

    foo.bar(Map("key1" -> "value1")) should be ("woohoo")
  }
}