Как использовать условный макет в Mockito - PullRequest
2 голосов
/ 18 июня 2019

У меня есть вызов метода scala, смоделированный с mockito.

Пусть объект будет 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

1 Ответ

1 голос
/ 18 июня 2019

Попробуйте answers из IdiomaticMockito вот так

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 , который является ванильным Mockito в дополнение к знанию особенностей Scala:

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

Вот то же решение с ванильным мокито

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