我是一个Akka应用程序的脚手架测试,我希望将一个actor注入测试类:
import akka.actor.ActorSystem
import akka.testkit.{ ImplicitSender, TestActors, TestKit }
import org.scalatest.{ BeforeAndAfterAll, Matchers, WordSpecLike }
import akka.actor.Props
import akka.actor.Actor
import akka.event.Logging
import akka.actor.ActorRef
class Simulation[A <: SimulationActor : scala.reflect.ClassTag]
extends TestKit(ActorSystem("AkkaSimulation")) with ImplicitSender
with WordSpecLike with Matchers with BeforeAndAfterAll {
override def afterAll {
TestKit.shutdownActorSystem(system)
}
val invariantActor1 = system.actorOf(Props(classOf[A1]))
val invariantActor2 = system.actorOf(Props(classOf[A2], invariantActor1))
val actorUnderTest = system.actorOf(Props[SimulationActor]) // how to pass additional argument to Props here?
// test logic here
}
// then elsewhere use the above template:
class Simulation1 extends Simulation[Sim1]
class Simulation2 extends Simulation[Sim2]
class Simulation extends Simulation[Sim3]
// and so on...
我在设计中遇到以下良性问题:
在提供类型参数A时,我在向Props
传递附加值参数时迷失了。无法找到适用于此情况的语法,因此怀疑Props
是否启用这个用例以任何简单的方式。以下行需要传递ActorRef
参数,因为SimulationActor
需要一个参数,但我无法找到通过它的方法。是否有一个替代的actor实例化形式,它将允许actor类型的类型参数和actor的构造函数的值参数?
val actorUnderTest = system.actorOf(Props[SimulationActor])
似乎不支持:
val actorUnderTest = system.actorOf(Props[SimulationActor], invariantActor2)
我在这个阶段沉默地介绍Akka Typed;为了纯粹的优雅,最好不要更改目标actor以在启动后接收其值参数作为消息,否则这是另一种解决方法。