Как смоделировать вызов по имени функции с помощью ScalaMock? - PullRequest
0 голосов
/ 16 мая 2018

Я хотел бы иметь возможность смоделировать мою функцию вызова по имени с помощью 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 () внутрииздеваться и вернуть результат.

1 Ответ

0 голосов
/ 17 мая 2018

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

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