2012-08-25 3 views
0

나는 akka 액터를 테스트하기위한 테스트 케이스를 작성 중입니다. 그러나 가짜 응용 프로그램 외부에서 별도의 Akka 시스템을 만들어야합니다. FakeApplication에서 akka 배우 시스템을 얻을 수있는 방법이 있습니까?Java 2.0의 FakeApplication에서 Play 2.0 액세스 재생의 Akka 배우 시스템

public class ChannelWorkerTest { 

    private TestActorRef<ChannelWorker> actorRef; 
    private ActorSystem actorSystem; 

    @Before 
    public void initActor() { 
     actorSystem = ActorSystem.apply(); 
     actorRef = TestActorRef.apply(new Props(ChannelWorker.class), actorSystem); 
    } 


    @Test 
    public void calculatePiFor1() { 
     running(fakeApplication(TestConf.getConf()), new Runnable() { 
      public void run() { 
       TestProbe testProbe = TestProbe.apply(actorSystem); 
       ..... 
       actorRef.tell(aMessage, testProbe.ref()); 
       } 
     }); 
    } 

    @After 
    public void shutdownActorSystem() { 
     actorSystem.shutdown(); 
    } 
} 

답변

0

이것은 내가 한 일입니다.

public class MyHelpers extends Helpers { 

    /** 
    * Build a new fake application. 
    */ 
    public static MyFakeApplication myFakeApplication(Map<String,String> additionalConfiguration, 
     List<String> withoutPlugins, List<String> additionalPlugin) { 
     return new MyFakeApplication(new java.io.File("."), MyHelpers.class.getClassLoader(), 
      additionalConfiguration, withoutPlugins, additionalPlugin); 
    } 

    /** 
    * Executes a block of code in a running application. 
    */ 
    public static void myRunning(MyFakeApplication fakeApplication, final Runnable block) { 
    try { 
     myStart(fakeApplication); 
     block.run(); 
    } finally { 
     myStop(fakeApplication); 
      play.core.Invoker$.MODULE$.system().shutdown(); 
      play.core.Invoker$.MODULE$.uninit(); 
    } 
    } 
} 


public class ChannelWorkerTest { 
    private MyFakeApplication app; 
    private TestActorRef<ChannelWorker> actorRef; 
    private ActorSystem actorSystem; 

    @Before 
    public void initTest() { 
    app = myFakeApplication(TestConf.getConf(), withoutPlugins, additionalPlugins); 
     actorSystem = play.api.libs.concurrent.Akka.system(app.getWrappedApplication()); 
     actorRef = TestActorRef.apply(new Props(new UntypedActorFactory() { 
      public UntypedActor create() { 
       return new MessageMaster(Config.NUMBER_OF_WORKER_ACTOR); 
      } 
     }), actorSystem); 
    } 


    @Test 
    public void calculatePiFor1() { 
     running(fakeApplication(TestConf.getConf()), new Runnable() { 
      public void run() { 
       TestProbe testProbe = TestProbe.apply(actorSystem); 
       actorRef.tell("Hello", testProbe.ref()); 
       testProbe.expectNoMsg(Duration.apply(100, TimeUnit.MILLISECONDS)); 
       } 
     }); 
    } 

    @After 
    public void shutdownActorSystem() { 
     actorSystem.shutdown(); 
    } 
} 
1

정적 메서드 Akka.system()을 사용하여 Akka 배우 시스템을 얻을 수 있습니다.

그러나 나는 그것이 FakeApplication 작동 생각하지 않는다, 당신은 testServer() helper 사용하여 재생 서버를 시작해야 할 수 있습니다

@Test 
public void testInServer() { 
    running(testServer(3333), new Runnable() { 
     public void run() { 
     ActorSystem actorSystem = Akka.system(); 
     // do whatever you need 
     } 
    }); 
} 
0

난 그냥 스칼라 시험에서 이런 짓을. 그러나 실행중인 블록 내부에서 액터를 초기화해야합니다. 그것은 자바에서 동일하게 작동 할 것이라고 추측하고 있습니다. 그러나 자바에서 테스트하지 않았습니다. 실제로 웹 서버를 시작할 필요가 없었습니다.

관련 문제