如何解决使用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 举报,一经查实,本站将立刻删除。