微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Akka类型的

如何解决使用Akka类型的

我正在使用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库中有一个MessageAdapter,似乎很适合我的需求。

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

解决方法

行为测试包中的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...
,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。