gpt4 book ai didi

scala - 我如何模拟 future 的 onComplete 方法?

转载 作者:行者123 更新时间:2023-12-01 12:41:33 25 4
gpt4 key购买 nike

我有一个 Akka actor,它处理包含 future 的消息。这是它的简化版本:

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 在 specs2 中对其进行测试,但是当我编写这样的规范时:

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 系统提示死信。

考虑到这可能是因为它没有等待 future 完成,我决定尝试模拟 future 并插入 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)
}
}
}

人们如何 mock 这样的 future ?或者有更好的方法吗?

最佳答案

我认为这里不需要任何模拟。

1- 像这样创建你的 Future 怎么样:MyMessage(Future.successful("test")),这样当你创建它时它就完成了。

2- 在对 result 调用 value 之前,您应该等待您的 actor 回复:

val result = worker ? message
Await.result(result, duration) must_== Success("test")

参见:http://www.scala-lang.org/api/current/index.html#scala.concurrent.Await$

3- 将 Future 的实例发送给 actor 对我来说是个糟糕的主意。

关于scala - 我如何模拟 future 的 onComplete 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24043469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com