测试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