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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...