Как издеваться над функцией вызова по имени с помощью ScalaMock?

Я хотел бы иметь возможность издеваться над моей функцией вызова по имени с помощью ScalaMock, чтобы он мог запускать переданную функцию внутри моего макета.

class MyTest extends Specification with MockFactory {

  trait myTrait {
    def myFunction[T](id: Int, name: String)(f: => T): Either[ErrorCode,T]
  }

  def futureFunction() = Future {
    sleep(Random.nextInt(500))
    10
  }

  "Mock my trait" should {
    "work" in {
      val test = mock[myTrait]

      (test.myFunction (_: Int)(_: String)(_: T)).expects(25, "test",*).onCall {
        _.productElement(2).asInstanceOf[() => Either[ErrorCode,T]]()
      }
      test.myFunction(25)("test")(futureFunction()) must beEqualTo(10)
    }
  }

}

Я попытался издеваться над функцией следующим образом:

(test.myFunction (_: Int)(_: String)(_: T)).expects(25, "test",*).onCall {
    _.productElement(2).asInstanceOf[() => Either[ErrorCode,T]]()
  }

но когда я запускаю тест, я получаю эту ошибку:

scala.concurrent.impl.Promise$DefaultPromise@69b28a51 cannot be cast to  Either

Как я могу издеваться над ним, чтобы он запускал мою futureFunction() внутри макета и возвращал результат.


person tea-addict    schedule 16.05.2018    source источник
comment
Вы можете попробовать с returns(Either[ErrorCode, T])() вместо onCall. Хм, мне нужно запустить это, чтобы попытаться решить эту проблему.   -  person Patryk Rudnicki    schedule 16.05.2018


Ответы (1)


Друг помог мне найти решение. Проблема связана с моим макетом для myFunction(). Я передаю функцию вызова по имени в myFunction()(f: => T), которая возвращает T, после ее оценки myFunction() возвращает Ether[ErrorCode, T]. Таким образом, макет должен быть таким:

(test.myFunction (_: Int)(_: String)(_: T)).expects(25, "test",*).onCall { test =>
    Right(test.productElement(2).asInstanceOf[() => T]())
}
person tea-addict    schedule 17.05.2018