Mi interessa sapere su come verificare la funzionalità Attore Akka, deridendo alcuni metodi (implementazione del metodo sostituto reale dell'oggetto/attore da deriso uno) in attore.Come verificare la funzionalità Attore Akka deridendo uno o più metodi in esso
Io uso akka.testkit.TestActorRef
;
Inoltre: ho provato a utilizzare SpyingProducer
ma non è chiaro come utilizzarlo. (come me se avessi creato un attore all'interno della sua implementazione sarebbe lo stesso che ho ora). Il risultato della ricerca di Google su questo non è molto verbose.
Io uso powemockito
e java
. Ma non importa. Sarei interessato a sapere how to do it in principle
con qualsiasi linguaggio con qualsiasi quadro
(quindi se non si sa come potere/Mockito funziona limita a fornire il codice .. (per favore) o idea completa di come si farebbe . farlo con gli strumenti che conoscete)
Quindi, supponiamo di avere un attore di prova:
package example.formock;
import akka.actor.UntypedActor;
public class ToBeTestedActor extends UntypedActor {
@Override
public void onReceive(Object message) throws Exception {
if (message instanceof String) {
getSender().tell(getHelloMessage((String) message), getSelf());
}
}
String getHelloMessage(String initMessage) { // this was created for test purposes (for testing mocking/spy capabilities). Look at the test
return "Hello, " + initMessage;
}
}
E nel nostro test vogliamo sostituire 01.231.126,963 milarestituire qualcos'altro.
Questo è il mio tentativo:
package example.formock;
import akka.testkit.TestActorRef;
...
@RunWith(PowerMockRunner.class)
@PrepareForTest(ToBeTestedActor.class)
public class ToBeTestedActorTest {
static final Timeout timeout = new Timeout(Duration.create(5, "seconds"));
@Test
public void getHelloMessage() {
final ActorSystem system = ActorSystem.create("system");
// given
final TestActorRef<ToBeTestedActor> actorRef = TestActorRef.create(
system,
Props.create(ToBeTestedActor.class),
"toBeTestedActor");
// First try:
ToBeTestedActor actorSpy = PowerMockito.spy(actorRef.underlyingActor());
// change functionality
PowerMockito.when(actorSpy.getHelloMessage (anyString())).thenReturn("nothing"); // <- expecting result
try {
// when
Future<Object> future = Patterns.ask(actorRef, "Bob", timeout);
// then
assertTrue(future.isCompleted());
// when
String resultMessage = (String) Await.result(future, Duration.Zero());
// then
assertEquals("nothing", resultMessage); // FAIL HERE
} catch (Exception e) {
fail("ops");
}
}
}
Risultato:
org.junit.ComparisonFailure:
Expected :nothing
Actual :Hello, Bob
Come ti testare in scala? mocking qui significa - prendere in giro un metodo. cioè sostituire un metodo su un oggetto reale (è per questo che usiamo spy() - essere in grado di mettere la nostra implementazione al metodo - lasciare che il metodo sappia cosa tornare per parametri particolari del metodo e non usare il corpo reale del metodo in onReceive () ma deriso uno). "TestActorRef consente in particolare di accedere all'attore sottostante" - ecco perché voglio utilizzare questo attore, ma non i juts inviare messaggi. Mocking and Spying è una pratica generica per Java, e in questo caso non funziona, anche se abbiamo accesso all'oggettivo obj – ses
E perché scala ragazzi così orgogliosi che conoscono scala ma non conoscono java? (senza offesa) :) – ses
Conosco java meglio di quanto conosca scala - solo non l'akka java api! – JasonG