2017-01-01 26 views
5

aşağıdaki Subscriber soyut temel sınıf var:Akka Kümesindeki bir Abonenin alım yöntemini nasıl test edebilirim?

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

Ve bunu bir alt sınıf abone olduğu için konulara yayınlanmaktadır mesajları aldığı test etmek istiyorum. Belirli aktörler TestProbe yoluyla olduğunu ulaşan mesajların hakkında iddialarda bulunan bilmek

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) 

tek yolu, ama ben bir TestProbe uzatmak yapabilir bilmiyorum: göstermektedir Bazı basit yalancı kod şudur sınıfım.

Genellikle, Akka docs, ilişkili test paketleriyle birlikte bir örnek kod içeriyor, ancak receive yöntemini test etmekle ilgili Akka Cluster belgelerinde hiçbir şey bulamadım.

Herhangi bir öneri var mı?

+0

Bir klik, bir alıcı bir şey aldığında ve üye değişkeni benim sınamamda ayarlandığını iddia ettiğinde, bir alıcı değişkeni "al" işlevini geçersiz kılmak ve değiştirmektir ... ancak bu kötüdür. Daha idiomatik bir test yaklaşımı arıyorum. – erip

cevap

0

Bu Bağımlılık Enjeksiyonunun test edilebilirlik konusunda yardımcı olduğu bir ders kitabı örneğidir.

Abone yapıcıda DistPubSub için arabulucuyu doğrudan doğruya almak yerine alırsanız, sınama donanımınızın bir parçası olarak DistPubSub'u kullanmanıza gerek kalmadan Suscriber aktörünü yalnız olarak test edebilirsiniz.

+0

Arabulucu sorun değil - sorun abonede bir mesaj alma beklentisidir. – erip

+1

Ancak bu durumda, sadece PubSub uzantısını gerçekten test ediyorsunuz ve aktörünüzün mantığını değil – emilianogc

+0

Doğru değil. Belki de sorumu anlamıyorsunuz - aktörümün mantığını test etmeye çalışıyorum. Arabulucu aboneden bağımsızdır, bu yüzden ilk olarak bir "PubSub" kullanırsınız - kimin zorunlu olarak yayınladığını takip etmekten kaçınmak için. – erip

İlgili konular