2017-01-01 11 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のメディエーターをSubscriberコンストラクターで直接受け取るのではなく、テストフィクスチャの一部としてDistPubSubを使用する必要なく、Suscriberアクターを単独でテストできます。

+0

メディエータは問題ではありません。問題はサブスクライバでメッセージを受信することです。 – erip

+1

しかしその場合は、実際にあなたの俳優の論理ではなくPubSubの拡張機能をテストしているだけです。 – emilianogc

+0

本当ではありません。おそらくあなたは私の質問を理解していない - 私は私の俳優の論理をテストしようとしています。調停者は加入者とは独立しています。なぜなら、誰が必然的に公表しているのかを把握することを避けるために、最初は「PubSub」を使用するのです。 – erip

関連する問題