测试Akka应用
Akka提供了一个全面的测试工具模块-TestKit。包含以下两个方面:
- 单元测试:可以测试独立的逻辑单元。这层级主要测试actors,threads,消息的顺序,并发中的错误;
- 整合测试:测试Actors行为,包括多线程任务,不确定的消息事件的顺序。
TestKit提供了基本的结构可以用来写单元测试,如果想用ToolKit需要在maven中加入以下支持:
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-testkit</artifactId>
<version>2.3.11</version>
</ dependency>
单元测试
为了测试业务逻辑,TestKit提供了TestActorRef,TestActorRef是一种特殊类型的引用,只用于测试目的。
TestActorRef提供了两种方式访问actor,如下:
- 它提供了一个对Actor对象的引用。只允许通过邮箱访问;
- 它允许执行actot的方法。
以下参见TickTock.java示例
访问Actor引用 通过以下方式获得:
TestActorRef<TickTock> actorRef = TestActorRef.apply(Props.create(TickTock.class), _system);
// get access to the underlying actor object
TickTock actor = actorRef.underlyingActor();
测试Actor行为
TestActorRef<TickTock> actorRef = TestActorRef.apply(Props.create(TickTock.class), _system);
String result = (String) Await.result(Patterns.ask(actorRef, new TickTock.Tick("msg"), 5000),
Duration.create(5, TimeUnit.SECONDS));
Assert.assertEquals("processed the tick message", result);
测试异常情况
测试不能处理的消息,抛出IllegalException。我们可以执行receive()方法,它将消息传给Actor,同时传播异常。
集成测试
不像传统的集成测试,测试系统中的各个组件,在Akka中,集成测试意味着测试Actor的功能。这就需要提套方案测试Actor,消息传递,actor返回,消息转发等。
如果我们又如下测试用例:
- EchoActor: It responds back with whatever has been passed to it
- BoomActor: It responds back with an exception to the string or integer passed
- ForwardingActor: It forwards the message to another actor
- SequencingActor: It replies back in a series of messages, but assumes we are interested in only one message *SupervisorActor: It manages a worker actor, and based on the exception thrown by it, applies the appropriate supervisor strategy
public void testEchoActor() {
ActorRef echoActorRef = _system.actorOf(Props.create(EchoActor.class));
// pass the reference to implicit sender testActor() otherwise
// message end up in dead mailbox
echoActorRef.tell("Hi there", super.testActor());
expectMsg("Hi there");
}
测试远程Actor