Я участвую в тестировании лесов для приложения 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 на этом этапе; ради чистой элегантности было бы неплохо не менять целевого субъекта, чтобы он получал свой аргумент значения в качестве сообщения после запуска, что в противном случае является обходным путем.