【问题标题】:How can I test a Subscriber's receive method in Akka Cluster?如何在 Akka Cluster 中测试订阅者的接收方法?
【发布时间】:2017-05-15 22:29:40
【问题描述】:

我有以下Subscriber抽象基类:

abstract class Subscriber(topics: Seq[String]) extends Actor with ActorLogging {
  import DistributedPubSubMediator.{ Subscribe, SubscribeAck }

  val mediator = DistributedPubSub(context.system).mediator

  // subscribe to each topic
  topics.foreach{mediator ! Subscribe(_, self)}

  def receive = {
    case SubscribeAck(Subscribe(name, None, `self`)) ⇒
      log.info(s"Subscribing to $name")
  }
}

我想测试它是否接收到发布到子类订阅的主题的消息。一些简单的伪代码演示如下:

val topic = "foo"

class FooSubscriber extends Subscriber(Seq(topic))

val fooSubActor = system.actorOf(Props[FooSubscriber])    
val mediator = DistributedPubSub(system).mediator
val msg = "This is a string"

// Publish the msg to the "foo" topic.
mediator ! Publish(topic, msg)

fooSubActor.expectMsg(msg)

我知道对特定参与者收到的消息进行断言的唯一方法是通过TestProbe,但我不知道如何使TestProbe 扩展我的课程。

通常,Akka docs 有大量示例代码以及相关的测试套件,但我在 Akka Cluster 文档中找不到与测试 receive 方法相关的任何内容。

有人有建议吗?

【问题讨论】:

  • 一个组合是覆盖receive 并在参与者收到任何内容时更改成员变量并断言该成员变量已在我的测试中设置......但这很糟糕。寻找更惯用的测试方法。

标签: scala unit-testing akka akka-cluster distributedpubsub


【解决方案1】:

这是一个教科书示例,说明依赖注入有助于提高可测试性。

如果您在 Subscriber 构造函数中收到 DistPubSub 的中介,而不是直接请求它,您可以单独测试 Suscriber actor,而无需将 DistPubSub 作为测试夹具的一部分。

【讨论】:

  • 中介不是问题——问题是在订阅者中接收消息的期望。
  • 但在这种情况下,你只是在真正测试 PubSub 扩展,而不是你的 actor 的逻辑
  • 不正确。也许你不明白我的问题——我正在尝试测试我的演员的逻辑。调解员独立于订阅者,这就是为什么您首先要使用 PubSub 的原因 - 以避免跟踪必须发布的人。
  • 在示例中,您为订阅者提供的唯一逻辑是订阅特定主题并在收到 Ack 时记录。在示例测试中,您断言订阅者在发布到 PubSub 系统后会收到一条消息。但这不是订阅者的责任,只是 PubSub 的责任,因此您只是真正断言 PubSub 重新发送消息。另一方面,订阅者的职责是订阅主题,因此如果您为中介发送 TestProbe,您可以断言它实际上发送了订阅消息
猜你喜欢
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
相关资源
最近更新 更多