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

#scala #akka #akka-testkit

#скала #акка #akka-тестовый набор #scala #akka #akka-testkit

Вопрос:

Я использую 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, который, кажется, идеально подходит для моих нужд.

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

Ответ №1:

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

Вы можете ввести тестовый зонд для 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...
  

Комментарии:

1. Большое спасибо за ответ. Однако мой вопрос был таков: » Я хочу протестировать эффект от создания адаптера сообщений. «.

2. Извини, пропустил это немного. Тогда это должно быть так же просто, как a: testKit.expectEffectType[MessageAdapter] с помощью набора тестов поведения. Он возвращает экземпляр effect, чтобы вы утверждали класс message и, возможно, вызывали функцию адаптации в тесте.

3. Как насчет testKit.expectEffectPF ?

Ответ №2:

Я нашел решение своей проблемы. Если вы заинтересованы в проверке, создан ли адаптер сообщений субъектом для определенного типа 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 не относится к тестируемому типу, тест завершается неудачей.

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