2017-05-30 2 views
0

Ich möchte mit Actor-Test in create actor Beispiel code.but durch Ausführen Actor Test wirft ActorInitializationException. mein Ziel ist es durch Schauspieler Test Testen Ziele sehen und ich bin mit JUnit-Test aber meinen Klassencode in unter:Test Actor in akka von Java und ActorInitializationException

public class Worker extends AbstractActor { 

private ActorSystem system = ActorSystem.create("worker");; 
private Props props = Props.create(Worker.class , system.guardian().toString()); 
private ActorRef actor = system.actorOf(props); 

@Override 
public void preStart() { 
    System.out.println("worker actor started"); 
} 

@Override 
public void postStop() { 
    System.out.println("worker actor stopped"); 
} 



@Override 
public Receive createReceive() { 
    return receiveBuilder() 
      .matchAny(x -> getSender().tell(x, getSelf())) 
      .build(); 
} 


@Test 
public void testMain() throws Exception { 
    Future sFuture = ask(actor, "ping" , 1000); 
    System.out.println("First : " + sFuture); 

} 

}

and when running test method in up code this exception occur: 

akka.actor.ActorInitializationException: You cannot create an instance of [akka.worker.Worker] explicitly using the constructor (new). You have to use one of the 'actorOf' factory methods to create a new actor. See the documentation. 

at akka.actor.ActorInitializationException$.apply(Actor.scala:192) 
at akka.actor.Actor$class.$init$(Actor.scala:467) 
at akka.actor.AbstractActor.<init>(AbstractActor.scala:132) 
at ir.dotin.alm.akka.worker.Worker.<init>(Worker.java:17) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:408) 
at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:187) 
at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:236) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:233) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:157) 
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117) 
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42) 
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262) 
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84) 
+1

Wie starten Sie diesen Schauspieler in Ihren Tests? Haben Sie Java-Dokumentation zum Testen von Akka Actor gesehen? http://doc.akka.io/docs/akka/current/java/testing.html – dvim

+0

Ich bin mit Definition Schauspieler – morteza

Antwort

0

Meine Vermutung: Sie haben den Test innerhalb des Schauspielers schrieben. Junit versucht, die Klasse, die die Tests enthält, mit new() zu instanziieren und damit zu versagen. Versuchen Sie, die Definitionen Aufspalten:

public class Worker extends AbstractActor { 

    @Override 
    public void preStart() { 
     System.out.println("worker actor started"); 
    } 

    @Override 
    public void postStop() { 
     System.out.println("worker actor stopped"); 
    } 



    @Override 
    public Receive createReceive() { 
     return receiveBuilder() 
       .matchAny(x -> getSender().tell(x, getSelf())) 
       .build(); 
    } 
} 

und dann in einer anderen Datei:

public class MyTest() { 
    private ActorSystem system = ActorSystem.create("worker");; 
    private Props props = Props.create(Worker.class , system.guardian().toString()); 
    private ActorRef actor = system.actorOf(props); 

    @Test 
    public void testMain() throws Exception { 
    Future sFuture = ask(actor, "ping" , 1000); 
    System.out.println("First : " + sFuture); 
    } 
} 
+0

Tanks für Ihre Antwort beginnen. Split-Test-Klasse – morteza

Verwandte Themen