Mockito Scala Specs2 имитирует сложные функции (Play Framework)

Я пытаюсь правильно заглушить API ehCache, используемый Play Framework. В частности, его функция getOrElse с сигнатурой:

def getOrElse[A: ClassTag](key: String, expiration: Duration)(orElse: => A) 

В моем коде спецификаций 2 у меня есть:

val mockCache = mock[EhCacheApi]
mockCache.getOrElse[???](anyString,anyObject[Duration])(???) returns 
[Object I'd like returned]

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

Тип возвращаемого значения для функции CacheApi должен быть Future[Seq[Object]] .

Ссылка на общедоступный репозиторий git: Github


person BZapper    schedule 14.03.2016    source источник


Ответы (1)


Это работает

class VariationAssignmentSpec(implicit ee: ExecutionEnv) extends PlaySpecification with Mockito {

  case class Variation(id: Option[Long] = None)

  lazy val v1 = Variation(Option(1L))
  lazy val v2 = Variation(Option(2L))

  "Cache#getOrElse" should {
    "return correct result" in {

      val mockCache = mock[CacheApi]

      mockCache.getOrElse[Future[Seq[Variation]]](anyString, any[Duration])(any)(any) returns
        Future(Seq(v1, v2))

      val resultFuture: Future[Seq[Variation]] =
        mockCache.getOrElse("cache.key", 10.seconds)(Future(Seq(v1,v2)))

      resultFuture must equalTo(Seq(v1,v2)).await
    }
  }

}
person Eric    schedule 14.03.2016
comment
Я получаю недостающий аргумент для метода apply в объекте Future, следуйте этому методу с `_', если вы хотите рассматривать его как частично примененную функцию, и моя фиктивная строка выглядит так: mockCache.getOrElse[Future[Seq[Variation] ]](anyString, any[Duration])(===(Future[Seq[Variation]])) возвращает Future(Seq(v1,v2)) - person BZapper; 14.03.2016
comment
Думаю, я запутался в том, что A должно быть для getOrElse[A] . - person BZapper; 15.03.2016
comment
Извините, я забыл передать параметр orElse. Я надеюсь, что это работает, потому что параметры по имени немного сложны с Mockito. - person Eric; 15.03.2016
comment
Если это все еще не работает, и ваш проект общедоступен, опубликуйте ссылку на свое репо. - person Eric; 15.03.2016
comment
все еще не совсем работает, он компилируется, но все равно не проходит тест. Это не общедоступный репозиторий, но я создам общедоступный с урезанным кодом и свяжу его здесь, заранее большое спасибо. - person BZapper; 15.03.2016
comment
Спасибо за проект, это действительно помогает. - person Eric; 15.03.2016
comment
Я получаю: org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Недопустимое использование сопоставителей аргументов! Ожидается 4 сопоставления, зарегистрировано 3: -› в org.specs2.mock.mockito.MockitoMatchers$class.anyString(MockitoMatchers.scala:14) -› в org.specs2.mock.mockito.MockitoMatchers$class.any(MockitoMatchers.scala :45) -> в org.specs2.mock.mockito.MockitoMatchers$class.any(MockitoMatchers.scala:45), - person BZapper; 17.03.2016
comment
Это работает для меня: github.com/zhangcbrian/specs2-mockito-so -пример/тянуть/1 - person Eric; 17.03.2016
comment
У меня он отлично работает и в sbt, но почему-то не работает в IntelliJ, тогда это похоже на проблему IntelliJ, большое спасибо! - person BZapper; 19.03.2016
comment
Еще один вопрос, а зачем там секунда (любая), чему она соответствует? @Эрик - person BZapper; 19.03.2016
comment
Второй any соответствует неявному ClassTag. - person Eric; 19.03.2016