如何从类型参数

时间:2018-05-06 02:22:07

标签: scala akka

我是一个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以在启动后接收其值参数作为消息,否则这是另一种解决方法。

1 个答案:

答案 0 :(得分:0)

好像Props没有足够的构造函数可供使用,所以ClassTag来救援!

import scala.reflect.ClassTag

class Simulation[A <: WorldSimulationActor : scala.reflect.ClassTag](implicit tag: ClassTag[A])

    .
    .
    .

  val actorUnderTestr = system.actorOf(Props(tag.runtimeClass, invariantActor2))

瞧。如果API docs隐藏了更简单的内容,我肯定没有发现它。