Maa*_*mon 5 scala actor akka akka-testkit
每当收到任何消息时,我都试图让测试探针以确认回复.
我在测试中编写了以下代码,但它不起作用:
val chgtWriter = new TestProbe(system) {
def receive: Receive = {
case m => println("receive messagereplying with ACK"); sender() ! ACK
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点.实际上将消息发送到测试探针的actor肯定在另一个线程上运行,而不是TestThread.您可以在下面看到当前制作的完整测试.
feature("The changeSetActor periodically fetch new change set following a schedule") {
scenario("A ChangeSetActor fetch new changeset from a Fetcher Actor that return a full and an empty ChangeSet"){
Given("a ChangeSetActor with a schedule of fetching a message every 10 seconds, a ChangeFetcher and a ChangeWriter")
val chgtFetcher = TestProbe()
val chgtWriter = new TestProbe(system) {
def receive: Receive = {
case m => println("receive message {} replying with ACK"); sender() ! ACK
}
}
val fromTime = Instant.now().truncatedTo(ChronoUnit.SECONDS)
val chgtActor = system.actorOf(ChangeSetActor.props(chgtWriter.ref, chgtFetcher.ref, fromTime))
When("all are started")
Then("The Change Fetcher should receive at least 3 messages from the ChangeSetActor within 40 seconds")
var changesetSNum = 1
val received = chgtFetcher.receiveWhile( 40 seconds) {
case FetchNewChangeSet(m) => {
println(s"received: FetchNewChangeSet(${m}")
if (changesetSNum == 1) {
chgtFetcher.reply(NewChangeSet(changeSet1))
changesetSNum += 1
}
else
chgtFetcher.reply(NoAvailableChangeSet)
}
}
received.size should be (3)
}
Run Code Online (Sandbox Code Playgroud)
}
changeSetActor经过全面测试并可以正常运行.测试与ChangeWriter挂起.它永远不会在receive方法中收到消息.
EDIT1(关注@Jakko anser)
该自动飞行员情况如下:
Run Code Online (Sandbox Code Playgroud)val probe = TestProbe() probe.setAutoPilot(new TestActor.AutoPilot { def run(sender: ActorRef, msg: Any): TestActor.AutoPilot = msg match { case "stop" ? TestActor.NoAutoPilot case x ? **testActor.tell(x, sender)**; TestActor.KeepRunning } })
虽然到目前为止给出的所有解释都很明确,但官方例子中令人困惑的是引用"testActor".谁是testActor?那时没有该名称的变量声明.
您可以使用Auto Pilots编写测试探针的脚本.例如:
import akka.testkit._
val probe = TestProbe()
probe.setAutoPilot(new TestActor.AutoPilot {
def run(sender: ActorRef, msg: Any): TestActor.AutoPilot = {
println("receive messagereplying with ACK")
sender ! ACK
TestActor.KeepRunning
}
})
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,我们使用自动消息处理程序Auto Pilot设置了一个测试探针.当探针收到消息时,将自动触发自动导航.在此示例中,自动驾驶仪将打印消息并回复发件人.
处理完消息后,自动驾驶员可以决定如何处理下一个传入消息.它可以设置不同的自动驾驶仪,重复使用现有的自动驾驶仪(TestActor.KeepRunning),或完全禁用自动驾驶仪(TestActor.NoAutoPilot).在此示例中,将使用相同的自动导航来处理所有传入消息.
即使将自动导频连接到探头,您仍可以照常使用测试探针断言.
在testActor官方文件中是指你对编写测试的演员.例如,在您的情况下,actor可以被ChangeSetActor赋值为value chgtActor.由于您真正想做的就是从探测器回复发送方,因此测试探针自动驾驶员响应发送方而不关心发送方就足够了testActor.
| 归档时间: |
|
| 查看次数: |
2426 次 |
| 最近记录: |