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