2017-01-01 12 views
5

Tôi có Subscriber trừu tượng lớp cơ sở sau đây:Làm cách nào để kiểm tra phương thức nhận của Người đăng ký trong Cụm 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") 
    } 
} 

Và tôi muốn thử nghiệm mà nó nhận được tin nhắn được công bố cho chủ đề mà một lớp con được đăng ký. Một số giả đơn giản mà chứng tỏ rằng là như sau:

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) 

Cách duy nhất mà tôi biết để làm khẳng định về thông điệp mà diễn viên cụ thể nhận được là bằng cách TestProbe, nhưng tôi không biết làm thế nào tôi có thể làm cho một TestProbe mở rộng lớp học của tôi.

Thông thường, Akka docs có nhiều mã mẫu với các bộ thử nghiệm liên quan, nhưng tôi không thể tìm thấy bất kỳ nội dung nào trong tài liệu cụm Akka liên quan đến thử nghiệm phương pháp receive.

Có ai có đề xuất không?

+0

Một kludge là ghi đè 'nhận' và thay đổi biến thành viên khi tác nhân nhận được bất kỳ điều gì và xác nhận rằng biến thành viên được đặt trong thử nghiệm của tôi ... nhưng điều này là xấu. Tìm cách tiếp cận thử nghiệm thành ngữ hơn. – erip

Trả lời

0

Đây là ví dụ về sách giáo khoa về nơi Dependency Injection giúp kiểm tra.

Nếu bạn nhận được người hòa giải cho DistPubSub trong nhà thầu thay vì trực tiếp yêu cầu, bạn chỉ có thể kiểm tra diễn viên Suscriber mà không cần sử dụng DistPubSub như một phần của thử nghiệm.

+0

Người hòa giải không phải là vấn đề - vấn đề là kỳ vọng nhận được tin nhắn trong thuê bao. – erip

+1

Nhưng trong trường hợp đó, bạn chỉ thực sự thử nghiệm phần mở rộng PubSub chứ không phải logic của diễn viên – emilianogc

+0

Không đúng sự thật. Có lẽ bạn không hiểu câu hỏi của tôi - Tôi đang cố gắng kiểm tra logic của diễn viên của tôi. Người hòa giải độc lập với người đăng ký, đó là lý do tại sao bạn sẽ sử dụng 'PubSub' ngay từ đầu - để giảm bớt việc theo dõi ai là người xuất bản nhất thiết. – erip

Các vấn đề liên quan