在 Akka Typed 中测试消息适配器

Test Message Adapters in Akka Typed

我正在使用 Akka Typed(版本 2.6.8)并且我开发了一个使用 消息适配器的 actor

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 库中有一个 class,MessageAdapter 似乎非常适合我的需求。

但是,我无法在任何地方找到如何使用它的示例。有帮助吗?

行为测试包中的 MessageAdapter 效果仅表示适配器已创建,作为消息或 actor 启动的结果。它不会帮助您验证适配器是否正常工作。

您可以为 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...

我找到了解决问题的办法。如果您有兴趣测试消息适配器是否由参与者为特定类型创建 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 建议的策略。