微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

akka ActorContext在集成测试中的使用

如何解决akka ActorContext在集成测试中的使用

我们正在将我们的项目迁移到键入的akka​​演员。我们提供的服务可以随意创建演员,例如:

class Service(ac: ActorContext[_])
   def action() = { 
     ac.spawn(MyBehavior().receive)
  }
}

当我们尝试测试此服务时,就会出现问题。看来我们应该只使用testKit.spawntestKit.createTestProbe方法。它可以很好地用于对我们的课程进行单元测试。

但是没有办法让ActorContext[_]传递给正在测试的服务。

因此,似乎我们在服务中滥用了ActorContext。但是服务如何创建新的参与者呢?

我想传递一个特殊的ActorRef[CreateActor]来创建那些演员。这样,我们可以删除ActorContext[_]中对Service的依赖,但是我想看看是否有更好的选择。

解决方法

首先,您不应该传递ActorContext,因为在上下文中公开的许多方法都不是线程安全的。

您可以为每个JVM创建一个ActorSystem[SpawnProtocol.Command],并将其传递给您的服务。

然后您可以发送Spawn命令,该命令将键入的actor行为发送给注入的actorSystem。

val echoActor: Future[ActorRef[Echo]] = actorSustem ? { replyTo: ActorRef[ActorRef[Echo]] =>  Spawn(echoBehavior,"echo-actor",Props.empty,replyTo)}

您是否真的需要从服务中创建参与者? 也许您可以进行顶层布线,在其中创建所有必需的参与者,然后向服务中注入ActorRef

当然,如果您的演员寿命短暂,并且根据需求被创建和销毁,那么我上面的建议是有道理的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?