0

akkaアクターをテストするためのテストケースを書いています。ただし、偽のアプリケーションの外部で別のAkkaシステムを作成する必要があります。FakeApplicationから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();
    }
}
4

3 に答える 3

1

静的メソッドを使用して、Akkaアクターシステムを取得しようとすることができますAkka.system()

ただし、FakeApplicationでは機能しないと思います。testServer()ヘルパーを使用してPlayサーバーを起動する必要がある場合があります。

@Test
public void testInServer() {
  running(testServer(3333), new Runnable() {
      public void run() {
         ActorSystem  actorSystem = Akka.system();
         // do whatever you need
      }
  });
}
于 2012-08-26T14:35:28.273 に答える
0

私はこれをscalaテストで行いました。ただし、実行中のブロック内でアクターを初期化する必要があります。Javaでも同じように動作すると思いますが、Javaではテストしていません。実際にWebサーバーを起動する必要はありませんでした。

于 2012-12-20T16:54:13.760 に答える
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();
    }
}
于 2012-12-20T21:49:52.903 に答える