2017-01-01 75 views
5

我有以下Subscriber抽象基类:如何测试Akka集群中的订户接收方法?

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包含大量带有相关测试套件的示例代码,但是我找不到有关测试receive方法的Akka Cluster文档中的任何内容。

有没有人有建议?

+0

当一个参与者接收到任何东西并断言成员变量在我的测试中被设置时,一个kludge是重写'receive'并更改一个成员变量......但这是不好的。寻找更为惯用的测试方法。 – erip

回答

0

这是一个教科书的例子,其中依赖注入有助于可测性。

如果您收到DistPubSub调解员在用户构造函数,而不是直接要求它,你可以只是测试的会员键演员孤立,而无需使用DistPubSub作为测试夹具的一部分。

+0

调解员不是问题 - 问题是期望在订户中接收消息。 – erip

+1

但是在这种情况下,你只是在测试PubSub扩展,而不是你的演员的逻辑 – emilianogc

+0

不正确。也许你不明白我的问题 - 我试图测试我的演员的逻辑。调解者独立于订阅者,这就是为什么你会首先使用“PubSub”的原因 - 避免跟踪谁必须发布。 – erip