我很想知道如何通过在 Actor 中模拟一些方法(用模拟的方法替换真实对象/演员的方法实现)来测试 Akka Actor 的功能。
我用akka.testkit.TestActorRef
;
另外:我尝试使用SpyingProducer
但不清楚如何使用它。(就像我在它的实现中创建actor一样,我现在拥有的是一样的)。关于那个的谷歌搜索结果不是很冗长。
我使用powemockito
和java
。但这无关紧要。我很想知道how to do it in principle
任何语言和任何框架
(因此,如果您不知道 power/mockito 是如何工作的,只需提供您的代码..(请)或完整了解您将如何使用您知道的工具来完成它。)
所以,假设我们有一个 Actor 来测试:
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