Тестовые адаптеры сообщений в Akka Typed

Я использую Akka Typed (версия 2.6.8) и разработал актера, использующего адаптер сообщений.

object EncoderClient {
sealed trait Command
final case class KeepASecret(secret: String) extends Command
private final case class WrappedEncoderResponse(response: Encoded) extends Command

def apply(encoder: ActorRef[Encode]): Behavior[Command] =
  Behaviors.setup { context =>
    val encoderResponseMapper: ActorRef[Encoded] =
      context.messageAdapter(response => WrappedEncoderResponse(response))
    Behaviors.receiveMessage {
      case KeepASecret(secret) =>
        encoder ! Encode(secret, encoderResponseMapper)
        Behaviors.same
      case WrappedEncoderResponse(response) =>
        context.log.info(s"I will keep a secret for you: ${response.payload}")
        Behaviors.same
    }
  }
}

Я хочу проверить эффект от создания адаптера сообщений. Я вижу, что в библиотеке testkit есть класс, MessageAdapter, который идеально подходит для моих нужд.

Однако я нигде не могу найти пример того, как его использовать. Любая помощь?


person riccardo.cardin    schedule 01.09.2020    source источник


Ответы (2)


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

Вы можете внедрить тестовый зонд для encoder, ожидая, что сообщение Encode получит доступ к адаптеру сообщений ActorRef в сообщении. Что-то вроде этого:

val probe = createTestProbe[Encode]()
val actor = spawn(EncoderClient(probe.ref))
actor ! KeepASecret("hush")
val encodeRequest = probe.receiveMessage()
encodeRequest ! Encoded(...)
// ... verify whatever happens on adapted response arriving...
person johanandren    schedule 02.09.2020
comment
Большое спасибо за ответ. Однако мой вопрос был следующим: Я хочу проверить эффект от создания адаптера сообщений. - person riccardo.cardin; 02.09.2020
comment
Извините, немного пропустил. Тогда это должно быть так же просто, как: testKit.expectEffectType[MessageAdapter] с набором тестов поведения. Он возвращает экземпляр эффекта, так что вы утверждаете класс сообщения и потенциально вызываете функцию адаптации в тесте. - person johanandren; 02.09.2020
comment
А как насчет testKit.expectEffectPF ? - person riccardo.cardin; 02.09.2020

Я нашел решение своей проблемы. Если вы хотите проверить, создан ли адаптер сообщений субъектом для определенного типа T, вы можете использовать BehaviorTestKit.expectEffectPF метод.

Следует пример:

"EncoderClient" should "send an encoding request to the encode" in {
  val encoder = TestInbox[Encode]()
  val client = BehaviorTestKit(EncoderClient(encoder.ref))
  client.run(KeepASecret("My secret"))
  client.expectEffectPF {
    case MessageAdapter(clazz, _) if clazz == classOf[Encoded] =>
  }
}

Если объект clazz не относится к тестируемому типу, тест завершается неудачно.

Вместо этого, если вы хотите проверить правильность работы адаптера сообщений, используйте стратегию, предложенную johanandren.

person riccardo.cardin    schedule 02.09.2020