Ho un attore FooActor
che viene passato il Props
per istanziare diversi BarActor
s e inviare BarMessage
s ad esso. Il codice funziona, ma sto facendo fatica a scrivere test per questo. La restrizione aggiunta è che posso usare solo il codice Java in questa app, nessun codice Scala.Come verificare che Actor Foo invii messaggi agli attori figli appena creati Bar?
Dopo vari tentativi, questo sembra essere il mio migliore sforzo finora:
@Test
public void testJavaTestKit() {
new JavaTestKit(system) {{
JavaTestKit probe = new JavaTestKit(system);
// pretending that the probe is the receiving Bar, by returning it in the Props
Props barActorProps = Props.create(BarActor.class, new Creator() {
@Override
public Object create() {
return probe.getRef();
}
});
Props props = Props.create(FooActor.class, barActorProps);
ActorRef subject = system.actorOf(props);
Object msg = // basically irrelevant, will trigger Bar instantiation and message sending
subject.tell(msg, probe.getRef());
expectMsgClass(Bar.BarMessage.class);
expectNoMsg();
}};
}
Tutto sembra avere un senso per me, ma anche se posso vedere i messaggi inviati a nuova creazione Bar
casi, il la prima asserzione fallisce. Che cosa sto facendo di sbagliato?
Aggiornamento:
La cosa che rende questo diverso dall'esempio documentazione di Akka, è che io non voglio passare un attore esistente che riceve il messaggio. Invece, voglio passare lo Props
che viene utilizzato per creare invece istanze di attori secondari. Nel test, voglio che il mio probe
riceva messaggi a quegli attori appena creati. Questo è il motivo per cui ho aggiunto il costrutto Props.create
che dovrebbe restituire sempre lo stesso probe actor. Proprio ora ho visto questo commento nell'API Creator.create
:
Questo metodo deve restituire un'istanza diversa ad ogni chiamata.
Quindi questo ovviamente non funzionerà, in quanto è esattamente ciò che voglio. Quindi la mia domanda generale rimane: come posso testare i messaggi inviati agli attori figli appena creati?
È il probe JavaTestKit ActorRef in cui ci si aspetta che un messaggio venga inviato? Se è così, è necessario chiamare probe.expectMsgClass, al momento si sta facendo valere contro il JavaTestKit anonimo nel metodo di test. A meno che il tuo test "soggetto" non risponda con un Bar.BarMessage.class, l'asserzione fallirà sempre – nickebbitt
La soluzione potrebbe essere semplice come cambiare l'asserzione a 'probe.expectMsgClass (Bar.BarMessage.class);' – nickebbitt
Grazie per il tuo risposta.Sembrava davvero promettente, e forse mi ha avvicinato alla soluzione, anche se non funziona ancora in questo momento. –