3.1 测试 Actors
首先,我们需要学习如何测试发送和接受消息,首要的是,忘记单向风格, 然后开始请求-应答交互的双向风格。 我们使用 ScalaTest 单元测试框架,这个框架也被 Akka 用来测试自身。 ScalaTest 是 xUnit 风格的测试框架,如果你不熟悉,且想了解更多, 请访问 http://www.scalatest.org/ 获取更多信息。 ScalaTest 框架的设计目标就是可读性,因此不需要太多介绍就非常容易阅读和理解。 第一次接触时,测试 Actors 比测试一般对象要难,因为:
- 时机 - 消息发送是异步的,因此单元测试中难于知道何时断言期望值, 
- 异步性 - Actors 用来在多个线程中并行运行。 多线程测试比单线程测试困难,需要并发元语来同步各种 actor 的结果,如 lock, latch, 和 barriers 等。我们极力想避免的正是这些东西。一个 barrier 用不对就 可能中止了整个测试套件的执行。 
- 无状态 - actor 掩盖了内部状态,不允许外部访问。访问只能通过 ActorRef。 对 actor 调用方法,检查其状态,都被特意阻止了,这些都是你想在单元测试时做的。 
- 合作/集成 - 如果你想集成测试很多 actors, 你可能想窃听 actors 之间的消息来 判断是否是预计值。怎样做并不能立即想到。 
幸运的是,Akka 提供了 akka-testkit 模块。 这个模块包含了大量使得测试 actors 大大简化的测试工具。 测试工具模块使得不同类型的测试成为可能:
- 单线程单元测试 - actor 实例一般情况下不能直接访问。测试工具箱提供了 TestActorRef, 它允许访问底层的 actor 接口。这使得如下情况成为可能:通过直接调用自己定义的方法来测试 actor 实例,或者在单线程环境中调用接收函数,如你习惯的测试一般对象一样。 
- 多线程单元测试 - 测试工具箱模块提供了 TestKit 和 TestProbe 类,使得可以接受从 actor 的回复,检查消息,设定特定消息到来的时间范围。TestKit 有方法来断言预期的消息。 在多线程环境下,Actors 使用普通分派器运行。 
- 多 JVM 测试 - Akka 也提供了测试多个 JVM 的工具,在你想测试远程 Actor 系统时很方便。 多 JVM 测试在第五章中讨论。 
TestKit 中 TestActorRef 继承了 LocalActorRef 类,将分派器设置为专门用来测试的 CallingThreadDispatcher。 (它在调用线程上启动 actors, 而不是另外的线程上)这离上述问题的答案又近了一大步。
看你的喜好,你可能使用某种风格更多一些。更接近实际生产环境代码的方式当然是以多线程方式使用 TestKit 类。 我们会更关注多线程方式的测试,因为这可以发现代码中在单线程环境中不出现的问题。 (我们也喜欢经典的单元测试,而不是打桩测试,你应该不会感到惊讶,)
下一步,我们介绍准备开始写测试(启动)所必须的东西,然后我们开始测试消息,并看看一些可以工作的例子。