Невозможно создать заглушку с аргументом Array в ScalMock

Вот пример того, чего я пытаюсь достичь. Заглушка всегда возвращает ноль, но если я изменю Array(1L) в * оно работает. Кажется, есть проблема с аргументами массива.

trait Repo {
    def getState(IDs: Array[Long]): String
}


"test" should "pass" in {
    val repo = stub[Repo]
    (repo.getState _).when(Array(1L)).returns("OK")
    val result = repo.getState(Array(1L))
    assert(result == "OK")
}

1 ответ

Смотрите этот пост:

Почему функция Array == не возвращает true для Array (1,2) == Array (1,2)?

ScalaMock работает нормально, но равенство массивов не позволяет вашему ожидаемому аргументу соответствовать вашему фактическому аргументу.

например, это работает:

 "test" should "pass" in {
   val repo = stub[Repo]
   val a = Array(1L)
   (repo.getState _).when(a).returns("OK")
   val result = repo.getState(a)
   assert(result == "OK")
 }

Однако есть также способ добавить пользовательский сопоставитель (определенный в org.scalamock.matchers.ArgThat):

 "test" should "pass" in {
   val repo = stub[Repo]
   (repo.getState _).when(argThat[Array[_]] {
     case Array(1L) => true
     case _ => false
   }).returns("OK")
   val result = repo.getState(Array(1L))
   assert(result == "OK")
 }

Обновление - пример для смешанных подстановочных знаков, литералов, argThat:

 trait Repo {
   def getState(foo: String, bar: Int, IDs: Array[Long]): String
 }

 "test" should "pass" in {
   val repo = stub[Repo]
   (repo.getState _).when(*, 42, argThat[Array[_]] {
     case Array(1L) => true
     case _ => false
   }).returns("OK")
   val result = repo.getState("banana", 42, Array(1L))
   assert(result == "OK")
 }
Другие вопросы по тегам