Как я могу разрешить конфликтующие системы акторов при тестировании акторов akka-http и akka в одном и том же файле спецификаций?

У меня есть Route, определенный с помощью akka-http, который использует актера внутри для отправки сообщений. Мой маршрут выглядит так:

      path("entity") {
        post {
          entity(as[Enrtity]) {
            entity =>
              val result: Future[Message] = mainActor.ask {
                ref: akka.actor.typed.ActorRef[Message] =>
                  Message(
                    entity = entity,
                    replyRef = ref
                  )
              }
              complete("OK")
          }
        }
      }

Моя тестовая спецификация:

class APITest
    extends ScalaTestWithActorTestKit(ManualTime.config)
    with ScalatestRouteTest
    with AnyWordSpecLike {
      val manualTime: ManualTime = ManualTime()
     // my tests here ...
}

Компиляция теста не удалась, так как есть конфликтующие системы акторов:

class APITest inherits conflicting members:
[error]   implicit def system: akka.actor.typed.ActorSystem[Nothing] (defined in class ActorTestKitBase) and
[error]   implicit val system: akka.actor.ActorSystem (defined in trait RouteTest)

Переопределение системы акторов также не помогает, поскольку унаследованные системы акторов бывают как типизированными, так и нетипизированными. Как я могу решить это легко?

Обновление:

Это связано с конфликтующими унаследованными членами с разными типами, но мы могли бы по-разному решить то, чего я хочу достичь в этом контексте.


person Esildor    schedule 29.03.2020    source источник
comment
ScalaTestWithActorTestKit и ScalatestRouteTest несовместимы. Если вам ScalaTestWithActorTestKit не особо нужен, может можно его убрать?   -  person jrudolph    schedule 30.03.2020


Ответы (1)


Я провел здесь немного времени, пока переходил к машинописному тексту. Для тех, кто все еще ищет, есть хороший совет по адресу https://developer.lightbend.com/guides/akka-http-quickstart-scala/testing-routes.html

// the Akka HTTP route testkit does not yet support a typed actor system (https://github.com/akka/akka-http/issues/2036)
// so we have to adapt for now
lazy val testKit = ActorTestKit()
implicit def typedSystem = testKit.system
override def createActorSystem(): akka.actor.ActorSystem =
  testKit.system.classicSystem

Глядя на первый комментарий на https://github.com/akka/akka-http/issues/2036 отмечает

Возможно, просто дополнение к документам, чтобы показать, что вам не нужно использовать ActorTestKit из Akka Typed, и вы можете просто использовать TestProbes, например. https://gist.github.com/chbatey/964b80adc2cd124fa4bf4624927b5be0

or val probe = TestProbe[Ping]() > val probe = testKit.createTestProbe[Ping]()

person pgn    schedule 06.05.2021