Мне интересно узнать, как протестировать функциональность Akka Actor, , высмеивая некоторые методы (замените реализацию реализатора реального объекта/актора, посмеявшись над ним) в Actor.
Я использую akka.testkit.TestActorRef
;
Также: я пытался использовать SpyingProducer
, но неясно, как его использовать. (например, если бы я создал актера внутри его реализации, он был бы таким же, как у меня сейчас).
Результат поиска Google об этом не очень подробный.
Я использую powemockito
и java
. Но это не имеет значения. Мне было бы интересно узнать how to do it in principle
с любым языком с любой структурой
(так что если вы не знаете, как работают power/mockito, просто предоставляйте свои код.. (пожалуйста) или полное представление о том, как вы это сделаете с помощью своих инструментов, которые вы знаете.)
Итак, скажем, у нас есть актер для тестирования:
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;
}
}
И в нашем тесте мы хотим заменить getHelloMessage()
на возврат чего-то еще.
Это моя попытка:
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");
}
}
}
Результат:
org.junit.ComparisonFailure:
Expected :nothing
Actual :Hello, Bob