2012-11-14 67 views
3

我對Akka很新,我正在嘗試用Java編寫一些單元測試。考慮以下參與者:如何在Java中正確測試Akka actor?

public class Worker extends UntypedActor { 

    @Override 
    public void onReceive(Object message) throws Exception { 

    if (message instanceof Work) { 
     Work work = (Work) message; 
     Result result = new Helper().processWork(work); 
     getSender().tell(result, getSelf()); 
    } else { 
     unhandled(message); 
    } 
    } 

} 

什麼是攔截電話的正確方法new Helper().processWork(work)?在一個側面說明,是否有任何建議的方式來實現Java中的Akka actor的依賴注入?

在此先感謝。

回答

3

你的代碼已經正確地檢驗的:

  • 你可以單獨測試你的業務邏輯,因爲你可以實例演員
  • Helper之外,一旦你確信該Helper做的是什麼應該做的,只是發送一些投入到演員和觀察,正確的答覆回來

現在,如果你需要有一個「嘲笑」 Worker測試一些其他組件,根本不要使用工人,而是使用TestProbe。你通常在哪裏得到工人的ActorRef,只需要注入probe.getRef()

那麼,如何注入?

我假設你的其他組件是一個Actor(否則你不會遇到任何你通常使用的注入技術的麻煩)。然後,有三個基本的選擇:

  1. 傳作爲構造函數的參數
  2. 消息
  3. 內發送,如果行爲人導致裁判作爲其子,通過在Props,有可能在替代構造

第三種情況可能是你正在尋找(我根據演員類的名稱猜測)什麼:

public class MyParent extends UntypedActor { 
    final Props workerProps; 

    public MyParent() { 
    workerProps = new Props(...); 
    } 
    public MyParent(Props p) { 
    workerProps = p; 
    } 

    ... 
    getContext().actorOf(workerProps, "worker"); 
} 

然後你就可以注入TestProbe這樣的:

final TestProbe probe = new TestProbe(system); 
final Props workerMock = new Props(new UntypedActorFactory() { 
    public UntypedActor create() { 
    return new UntypedActor() { 
     @Override 
     public void onReceive(Object msg) { 
     probe.getRef().tell(msg, getSender()); 
     } 
    }; 
    } 
}); 
final ActorRef parent = system.actorOf(new Props(new UntypedActorFactory() { 
    public UntypedActor create() { 
    return new MyParent(workerMock); 
    } 
}), "parent"); 
+0

總的來說,這是一個堅實的方法,但它確實有一個打嗝:在某些情況下,父母的演員可能要提供參數給孩子。在這種情況下,必須提供某種* Props factory *(而不是Props的實例) - 只要注意這些工廠的可串行化。 – Andrey