Невозможно создать заглушку с аргументом 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")
}