在 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 建议的策略。
我正在使用 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 建议的策略。