Scala 测试对剧中阿克卡演员的呼叫

Scala 测试对剧中阿克卡演员的呼叫,scala,testing,playframework,akka,actor,Scala,Testing,Playframework,Akka,Actor,我已经在一个play应用程序中重构了一堆电子邮件发送代码,以便使用actor异步完成这项工作 当我需要发送电子邮件时,我现在注射了一种EmailActor,然后我打电话给EmailActor?EmailRequest(发件人、收件人)发送 我的问题是,我怎样才能单元测试演员是否被真正调用 我阅读了Akka关于测试的文档,但在我看来,它关注的是测试参与者本身,而不是他们的调用,而且根本不清楚我应该从哪里开始。您可以使用一个,并将其注入到您的电子邮件服务中。看看这个简单的测试用例 导入akka.a

我已经在一个play应用程序中重构了一堆电子邮件发送代码,以便使用actor异步完成这项工作

当我需要发送电子邮件时,我现在注射了一种
EmailActor
,然后我打电话给
EmailActor?EmailRequest(发件人、收件人)
发送

我的问题是,我怎样才能单元测试演员是否被真正调用

我阅读了Akka关于测试的文档,但在我看来,它关注的是测试参与者本身,而不是他们的调用,而且根本不清楚我应该从哪里开始。

您可以使用一个,并将其注入到您的电子邮件服务中。看看这个简单的测试用例


导入akka.actor.{ActorRef,ActorSystem}
导入akka.pattern.ask
导入akka.testkit.{testkit,TestProbe}
导入akka.util.Timeout
导入org.scalatest.flatspec.asyncFlatspecike
导入scala.concurrent.Future
导入scala.concurrent.duration_
类TestProbeActorExample
扩展测试套件(ActorSystem(“测试”))
像这样的{
类MyService(actorRef:actorRef){
def sendEmail(电子邮件:字符串):Future[Int]={
隐式val超时:超时=1.5秒
(actorRef?电子邮件).mapTo[Int]
}
}
它应该“测试一个演员”{
val testProbe=testProbe()
val service=newmyservice(testProbe.ref)
val statusCode=服务。发送电子邮件(“电子邮件”)
testProbe.expectMsg(“电子邮件”)
testProbe.reply(10)
map(r=>assert(r==10))
}
}

请注意,如果您使用
ask
模式,您需要声明已使用
expectMsg
接收到消息,然后您必须使用
reply

将回复发送回测试中的
新MyService(…)
。。。在我的例子中,服务是通过Guice实例化并注入到控制器中的,因此我无法继续same@Weier您是在测试控制器还是服务?如果您依赖于Giuce进行注入,则需要创建此处定义的自定义绑定