如何在 Mockito 中使用条件模拟
How to use conditional mock in Mockito
我有一个用 mockito 模拟的 scala 方法调用。
设对象为a
,方法为b
,方法b采用Map[String, String]
类型的参数。我想要一个满足特定条件的地图。我不知道这个地图的所有键值对,但我想确保地图有像 key1
-> value1
和 key2
-> value2
这样的键值对
当我使用这样的东西时
when(a.b(any[Map[String, String]])) thenReturn something
这里any
是org.mockito
中的静态成员。但我不能在这里使用它,因为这个模拟满足 Map
任何键和值。
在这种情况下如何实现条件模拟??
我正在寻找类似于 where
方法的实用程序
org.scalamock.matchers.Matchers
像这样从 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")
请注意,我们使用 mockito-scala,这是除了了解 Scala 细节之外的香草 Mockito:
libraryDependencies += "org.mockito" %% "mockito-scala" % "1.5.11"
这是与 vanilla 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")
}
}
我有一个用 mockito 模拟的 scala 方法调用。
设对象为a
,方法为b
,方法b采用Map[String, String]
类型的参数。我想要一个满足特定条件的地图。我不知道这个地图的所有键值对,但我想确保地图有像 key1
-> value1
和 key2
-> value2
这样的键值对
当我使用这样的东西时
when(a.b(any[Map[String, String]])) thenReturn something
这里any
是org.mockito
中的静态成员。但我不能在这里使用它,因为这个模拟满足 Map
任何键和值。
在这种情况下如何实现条件模拟??
我正在寻找类似于 where
方法的实用程序
org.scalamock.matchers.Matchers
像这样从 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")
请注意,我们使用 mockito-scala,这是除了了解 Scala 细节之外的香草 Mockito:
libraryDependencies += "org.mockito" %% "mockito-scala" % "1.5.11"
这是与 vanilla 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")
}
}