2017-05-30 4 views
0

Je veux utiliser à partir de test d'acteur dans l'exemple de code create actor, mais en exécutant le test d'acteur throws ActorInitializationException. mon objectif est de voir le test buts par le test acteur et je suis en utilisant le test JUnit mais mon code de classe en moins:Test acteur dans akka par java et avoir 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

Comment commencer cet acteur-vous dans vos tests? Avez-vous vu la documentation Java sur les tests Akka Actor? http://doc.akka.io/docs/akka/current/java/testing.html – dvim

+0

Je commence avec l'acteur de définition – morteza

Répondre

0

Je pense: Vous avez écrit le test dans l'acteur. Junit essaie d'instancier la classe contenant les tests avec new(), échouant ainsi. Essayez diviser les définitions:

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(); 
    } 
} 

puis, dans un autre fichier:

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

réservoirs pour votre réponse. classe de test divisée – morteza