2014-04-01 92 views
1

我想測試一個在Eclipse SDK(構建ID:3.0.2-vfinal-20131028-1923-Typesafe)的Scala IDE構建中使用java的單身演員和阿卡是2.3.1。Junit測試一個Akka單身演員:preStart()鉤子不叫

public class WorkerTest { 

static ActorSystem system; 

@BeforeClass 
public static void setup() { 
    system = ActorSystem.create("ClusterSystem"); 
} 

@AfterClass 
public static void teardown() { 
    JavaTestKit.shutdownActorSystem(system); 
    system = null; 
} 

@Test 
public void testWorkers() throws Exception { 
    new JavaTestKit(system) {{ 

     system.actorOf(ClusterSingletonManager.defaultProps(
       Props.create(ClassSingleton.class), "class", 
       PoisonPill.getInstance(),"backend"), "classsingleton"); 

     ActorRef selection = system.actorOf(ClusterSingletonProxy.defaultProps("user/classsingleton/class", "backend"), "proxy"); 
     System.out.println(selection); 
    }}; 
} 
} 

的ClassSingleton.java:

public class ClassSingleton extends UntypedActor { 

LoggingAdapter log = Logging.getLogger(getContext().system(), this); 

public ClassSingleton() { 
    System.out.println("Constructor is done"); 
} 

public static Props props() { 
    return Props.create(ClassOperator.class); 
} 

@Override 
public void preStart() throws Exception { 
    ActorRef selection = getSelf(); 
    System.out.println("ClassSingleton ActorRef... " + selection); 
} 

@Override 
public void onReceive(Object message) { 
} 

@Override 
public void postStop() throws Exception { 
    System.out.println("postStop ... "); 
} 


} 

的ClassSingleton演員無所事事,打印輸出: 演員[阿卡:// ClusterSystem /用戶/代理#-893814405]唯一的,這是從ClusterSingletonProxy打印。沒有例外和Junit完成,綠旗。在調試中不調用ClassSingleton(包括構造函數和preStart())。當然是我,但是錯誤是什麼?更令人困惑的是,同樣的ClassSingleton ClusterSingletonManager代碼在javatestkit和junit之外工作得很好。

我懷疑羣集設置可能是負責任的,所以我試圖包含和排除下面的代碼(沒有效果)。不過,我想明白爲什麼我們需要它,如果我們需要它(它來自示例代碼)。 非常感謝您的幫助。

Address clusterAddress = Cluster.get(system).selfAddress(); 
Cluster.get(system).join(clusterAddress); 

回答

2

代理模式標準行爲是找到最老的節點,並在那裏部署'真正的'actor,並在所有節點上啓動代理角色。我懷疑集羣配置沒有完成,因此你的演員爲什麼沒有開始。

join方法使節點成爲羣集的成員。因此,如果沒有人加入集羣,則無法創建具有代理的actor。

問題是,在junit測試期間讀取的配置文件是否具有創建羣集的所有信息?種子節點?端口是否設置爲與種子節點相同?

+0

沒有成功,我檢查了配置,端口等等,我訂購了集羣域事件,沒有事件,沒有死系統,但是沒有JUnit也沒問題。我很感激,如果有人能給我一個工作junit的例子(配置)。 – user1229873

+0

更新:我可以設置簡單的演員,發送和處理消息,其他人仍然失敗。 – user1229873

+0

https://github.com/almendar/akka-junit-sample < - 試試這個。它是否滿足您的需求? 看看'testWorkers'最後一行。如果你評論它不起作用,我已經放了一個'sleep'。 – almendar