我正在尝试理解akka-Testkit",并希望可以询问它。
我找到了一些教程和博客,可以访问TestActorRef上的underlyingActor上的state-或lastMsg-属性。但是,来自" akka-testkit_2.11"的一个TestActorRef; %" 2.4.10"没有这些属性。我查看了akka网站上的示例,也许我错过了一些东西,但是他们展示了其他一个echo actor的测试,但没有任何简单的actor实现。
那么,如果n%3 == 0(例子中就是这种情况),有人可以帮助我理解如何测试将使用相同数字响应的工作者。如果可能的话,我宁愿不使用未来和问题模式,并希望对演员将给出的响应进行测试(通过访问其状态或类似的东西,从演员的角度来看)。
class ProjectEulerScalaTestAkka extends TestKit(ActorSystem("testing")) with WordSpecLike with MustMatchers {
"A simple actor" must {
val actorRef = TestActorRef[Worker]
"receive messages" in {
actorRef ! 3
actorRef.underlyingActor.state//must not equal("world")
}
}
}
相关: How do I test an Akka actor that sends a message to another actor?
目前我正在使用同步测试方法;
import akka.actor.ActorSystem
import akka.testkit.{TestActorRef, TestKit}
import org.scalatest.Matchers
import org.scalatest.WordSpecLike
import akka.pattern.ask
import scala.concurrent.Future
import scala.concurrent.duration._
import scala.util.Success
class ProjectEulerScalaTestAkka extends TestKit(ActorSystem("testing")) with WordSpecLike with Matchers {
implicit val time = akka.util.Timeout(100 seconds)
"A simple actor" must {
val actorRef = TestActorRef[Worker]
"receive messages" in {
val f = (actorRef ? 3).asInstanceOf[Future[Int]]
val reply = f.value.get
reply should equal (Success(3))
}
}
}
答案 0 :(得分:0)
我所做的是模拟我发送消息的Actor的接口,捕获消息并将成功消息发送回testActor引用。
使用捕获的消息有效负载的成功对象
input("What do you want to call your file?")
+=".txt"
您发送消息的模拟演员,反过来,它会向测试演员返回一些值
case class SuccessWith(capturedMessage:Any = null)
设置您想要进行单元测试的演员
case class MockActor(requester: ActorRef) extends Actor {
override def receive: Receive = {
case i: Int => {
requester ! i
}
}
}
然后你的测试
val actorRef = system.actorOf(Props(new YourActor(args)))