Ich bin daran interessiert zu wissen, wie Akka Darsteller Funktionalität zu testen, durch einige Methoden (Ersatz realen Objekt/der Schauspieler Methode Umsetzung durch verspottet ein spöttischen) in Schauspieler.Wie durch spöttische eine oder mehrere Methoden Akka Schauspieler Funktionalität zu testen darin
Ich verwende akka.testkit.TestActorRef
;
Auch: Ich habe versucht, SpyingProducer
zu verwenden, aber es ist nicht klar, wie man es benutzt. (Wie ich, wenn ich Schauspieler in seiner Implementierung erstellen würde, wäre es dasselbe, das ich jetzt habe). Das Google-Suchergebnis darüber ist nicht sehr verbose.
Ich verwende powemockito
und java
. Aber das ist egal. Es würde mich interessieren how to do it in principle
mit jeder Sprache zu wissen, mit jedem Rahmen
(also, wenn Sie nicht wissen, wie Kraft/Mockito funktioniert Ihr Code nur zur Verfügung stellen .. (bitte) oder vollständige Vorstellung darüber, wie würden Sie . So tun Sie es mit Ihren Tools, die Sie kennen)
, lassen Sie uns sagen, dass wir einen Schauspieler zu Test haben:
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;
}
}
Und in unserem Test wollen wirersetzenetwas anderes zurückgeben. Diese
ist mein Versuch:
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");
}
}
}
Ergebnis:
org.junit.ComparisonFailure:
Expected :nothing
Actual :Hello, Bob
Wie man es in scala testen würde? Spott bedeutet hier - eine Methode zu verspotten. dh ersetze eine Methode an einem realen Objekt (deshalb benutzen wir spy()), um unsere Implementierung in die Methode einzufügen, um zu wissen, was für bestimmte Methodenparameter zurückzugeben ist und nicht den realen Körper der Methode in onReceive () aber verspottet eins). "TestActorRef gibt Ihnen speziell Zugriff auf den zugrunde liegenden Akteur" - deshalb möchte ich diesen Akteur verwenden, aber keine Nachrichten senden. Mocking und Spioning ist allgemeine Praxis für Java, und in diesem Fall funktioniert es nicht, obwohl wir Zugriff auf Schauspieler obj haben – ses
Und warum scala Jungs so stolz, dass sie scala wissen, aber nicht Java? (nichts für ungut) :) – ses
Ich kenne Java besser als ich scala kenne - nur nicht die akka java api! – JasonG