У меня есть актер Akka, который работает с сообщением, содержащим будущее. Вот его упрощенная версия:
case class MyMessage(s: Future[String])
class MyWorker extends Actor {
override def receive: Receive = {
case MyMessage(future) =>
future onComplete {
case Success(s) => sender ! s
case Failure(e) => throw e
}
}
}
Я использую TestActorRef для тестирования в спецификации2, но когда я пишу такую спецификацию:
class MyWorkerSpec extends Specification with Mockito {
val worker = TestActorRef(new MyWorker)
"MyMessage" should {
"return the string from a successful result" in {
val message = MyMessage(Future("test"))
val result = worker ? message
result.value.get must_== Success("test")
}
}
}
...тогда с NoSuchElementException: None.get
происходит сбой, и система Akka жалуется на мертвые буквы.
Подумав, что это, вероятно, потому, что он не ждет завершения будущего, я решил попробовать смоделировать будущее и заглушить метод onSuccess
. Однако я не уверен, как это сделать, потому что аргумент func
, очевидно, является Any
.
class MyWorkerSpec extends Specification with Mockito {
val worker = TestActorRef(new MyWorker)
"MyMessage" should {
"return the string from a successful result" in {
val mockFuture = mock[Future[String]]
mockFuture.onComplete(any[Try[String] => String]) answers {
func => {
func(Success("test"))
}
}
worker ! MyMessage(mockFuture)
}
}
}
Как можно насмехаться над таким будущим? Или есть лучший способ сделать это?
TestActorRef
под капотом? Это на самом деле проходит черезactorOf(...)
? - person wheaties   schedule 04.06.2014