【问题标题】:How to use conditional mock in Mockito如何在 Mockito 中使用条件模拟
【发布时间】:2019-06-18 15:49:35
【问题描述】:

我有一个用 mockito 模拟的 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

【问题讨论】:

    标签: scala mockito wildcard scalatest


    【解决方案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")
    

    请注意,我们使用 mockito-scala 是 vanilla Mockito 除了了解 Scala 细节:

    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")
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-04-17
      • 2016-05-08
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多