2017-01-01 44 views
5

Mam następujący Subscriber abstrakcyjna klasa podstawowa:Jak mogę przetestować metodę odbioru Abonenta w Akka Cluster?

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") 
    } 
} 

I chciałbym przetestować że odbiera wiadomości, które zostały opublikowane w tematach na której podklasą jest zapisany. Niektóre proste pseudokod, który pokazuje, że jest następujący:

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) 

Jedynym sposobem, wiem, aby twierdzenia o wiadomości, które otrzymują konkretne aktorów jest w drodze TestProbe, ale nie wiem, jak mógłbym zrobić TestProbe przedłużyć moja klasa.

Zazwyczaj Akka docs ma mnóstwo przykładowego kodu z powiązanymi zestawami testów, ale nie mogłem znaleźć niczego w dokumentacji Akka Cluster dotyczącej testowania metody receive.

Czy ktoś ma sugestie?

+0

Kumulacja polega na zastąpieniu 'receive' i zmianie zmiennej składowej, gdy aktor otrzymuje cokolwiek i sprawdzenie, że zmienna składowa jest ustawiona w moim teście ... ale jest to złe. Poszukuje bardziej idiomatycznego podejścia do testowania. – erip

Odpowiedz

0

Jest to podręcznikowy przykład tego, gdzie Dependency Injection pomaga w testowalności.

Jeśli otrzymasz mediatora dla DistPubSub w konstruktorze subskrybenta, zamiast bezpośrednio go o to poprosić, możesz po prostu przetestować aktora Suscribera w izolacji, bez potrzeby korzystania z DistPubSub jako części twojego testowego urządzenia.

+0

Mediator nie jest problemem - problemem jest oczekiwanie na otrzymanie wiadomości od subskrybenta. – erip

+1

Ale w takim przypadku testujesz tylko rozszerzenie PubSub, a nie logikę swojego aktora. – emilianogc

+0

Nieprawda. Być może nie rozumiesz mojego pytania - próbuję sprawdzić logikę mojego aktora. Mediator jest niezależny od subskrybenta, dlatego w pierwszej kolejności używałeś 'PubSub', aby uniknąć śledzenia, kto publikuje w sposób konieczny. – erip