Как создать актер Akka из параметра типа - PullRequest
0 голосов
/ 06 мая 2018

Я участвую в тестировании лесов для приложения Akka, в котором я хочу внедрить актера в тестовый класс:

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...

У меня возникла следующая проблема с этим дизайном:

Я теряюсь при передаче дополнительного аргумента значения в Props при предоставлении параметра типа A. Не могу найти синтаксис, который работает для этого случая, из-за сомнений в том, что Props разрешает этот вариант использования в любом простом путь. Следующая строка должна передать аргумент ActorRef, потому что SimulationActor ожидает его, но я не могу найти способ передать его. Существует ли альтернативная форма создания экземпляра субъекта, которая допускает как параметр типа для типа субъекта, так и параметр значения для конструктора субъекта?

val actorUnderTest = system.actorOf(Props[SimulationActor])

Похоже, что нет поддержки:

val actorUnderTest = system.actorOf(Props[SimulationActor], invariantActor2)

Я не собираюсь представлять Akka Typed на этом этапе; ради чистой элегантности было бы неплохо не менять целевого субъекта, чтобы он получал свой аргумент значения в качестве сообщения после запуска, что в противном случае является обходным путем.

1 Ответ

0 голосов
/ 06 мая 2018

Кажется, что 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 документах , я точно не заметил этого.

...