【问题标题】:Test Message Adapters in Akka Typed在 Akka Typed 中测试消息适配器
【发布时间】:2020-12-20 12:52:15
【问题描述】:

我正在使用 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
    }
  }
}

我想测试一下创建Message Adapter的效果。我看到 testkit 库中有一个类 MessageAdapter 似乎非常适合我的需求。

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

【问题讨论】:

    标签: scala akka akka-testkit


    【解决方案1】:

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

    【讨论】:

    • 非常感谢您的回复。但是,我的问题是:“我想测试一下创建Message Adapter的效果。”。
    • 抱歉,错过了一点。那么它应该像使用行为测试套件一样简单:testKit.expectEffectType[MessageAdapter]。它返回效果实例,以便您断言消息类并可能在测试中调用适配函数。
    • 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不是被测试的类型,则测试失败。

    相反,如果您有兴趣测试消息适配器是否正常工作,那么请使用 johanandren 建议的策略。

    【讨论】:

      猜你喜欢
      • 2016-03-25
      • 1970-01-01
      • 2021-06-06
      • 2013-11-29
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      相关资源
      最近更新 更多