1

我有一个使用 Spray、Akka 和 Scala 的应用程序。当前的单元测试是通过 Scala Test 完成的。该应用程序使用 Spray 路由来确定和解析有关 Web 请求的一些基本数据,然后将其传递给参与者以执行所需的操作。对于 Spray,我们使用一个自定义的初始化类,它继承自 spray.servlet.Initializer,它配置和启动每个参与者。这些操作的一部分是调用大约 7 或 8 个其他 Web 服务。每个都有一个参与者来处理与各自服务的通信。因此,我们在主要参与者中执行了一堆逻辑,将通信委托给其他参与者,最后除了它自己的工作之外,它还处理所有返回的数据。

我想使用 Scala Test 和 Akka Testkit 来测试整个系统,使用 Testkit 来替换通信参与者以返回合适的测试数据。

问题分为两部分。

  • 什么是更好的测试方法?我可以使用 Scala Testkit 通过 Spray Testkit 通过 Spray 路由服务发出请求。另一种方法是,由于主要参与者通过案例类获取路由服务结果,因此直接将消息传递给跳过路由服务的参与者。两者都有其优点。但是,我确实发现 Spray testkit 上的文档很少。当 spray.servlet.Initializer 中的参与者有初始化逻辑时,如何通过 Akka Testkit 替换参与者?

  • 第二个是如何通过 Akka Testkit 建立一个更复杂的 Actor 系统。文档提到这是可能的,但远未说明如何做到这一点。我有路由服务,它是一个参与者,它与作为业务逻辑主体的另一个参与者对话,然后与其他几个参与者对话。参考 Akka Testkit 文档,这些通信参与者是否被视为“儿童”参与者?是否有一个项目可以展示作为一个整体测试丰富的 Akka Actor 系统的最佳实践?

在这种情况下,我的直觉是拥有一组基于 Spray Testkit 的测试来测试我们的路由系统。然后,进行一组测试,将我们的数据案例类发送给主actor,并在其后面带有模拟的通信actor,并验证我们从主actor那里得到正确的响应。

4

1 回答 1

1

我通常为应用程序的每一层创建测试。另外,当我测试当前层时,我会模拟另一层。如果我正在测试业务,我会模拟 DAO,如果我正在测试喷雾路线,我会模拟业务对象(由我的喷雾路线使用)。当我使用 Actors 和 Spray 时,我总是尝试在主程序之前开始创建测试,这有助于我的应用程序架构应该如何。很多时候我需要重构我的类以使用dependency injection或不在val当前类/特征中设置,所以我可以模拟vals.

于 2016-04-13T03:12:18.547 回答