我有一个使用Spray,Akka和Scala的应用程序。当前的单元测试是通过Scala Test完成的。该应用程序使用Spray路由来确定和解析Web请求中的一些基本数据,然后将其传递给actor以执行所需的操作。对于Spray,我们使用一个自定义初始化类,它继承自spray.servlet.Initializer,它配置并启动每个actor。这些行动的一部分是呼叫7或8个其他Web服务。每个人都有一个演员来处理与各自服务的通信。因此,我们在主要演员中做了一堆逻辑,它将通信委托给其他演员,最后它除了处理自己的工作外,还处理所有返回的数据。
我想使用Scala Test和Akka Testkit测试整个系统,使用Testkit替换通信参与者以返回合适的测试数据。
问题是两部分。
测试的更好方法是什么?我可以使用Scala Testkit通过Spray Testkit通过Spray路由服务发出请求。另一种方法是,由于主要参与者通过案例类获取路由服务结果,所以只是直接将消息传递给跳过路由服务的该actor。两者都有其优点。但是我发现Spray testkit上的文档很少。当spray.servlet.Initializer中的那些actor有初始化逻辑时,如何通过Akka Testkit将演员分配?
第二个是如何通过Akka Testkit建立一个更复杂的演员系统。该文件提到这是可能的,但远没有表达出如何做到这一点。我有一个路由服务,它是一个与另一个演员交谈的演员,这个演员是大部分业务逻辑,但后来与其他几个演员交谈。是否考虑过这些沟通主体" Child"演员参考Akka Testkit文档?是否有一个项目展示了测试一个完整的Akka演员系统的最佳实践?
在这种情况下,我的直觉是使用基于Spray Testkit的测试集来测试我们的路由系统。然后,有一组测试将我们的数据案例类发送给主演员,后面有模拟的comm演员,并验证我们从主演员那里得到正确的答案。
答案 0 :(得分:1)
我通常会为我的应用程序的每一层创建测试。此外,我在测试当前图层时模拟了另一个图层。如果我正在测试业务,我会嘲笑DAO,如果我正在测试喷涂路线,我会模拟业务对象(我的喷涂路线使用)。
当我使用Actors和Spray时,我总是尝试在主程序之前开始创建测试,它有助于我的应用程序架构应该如何。很多时候我需要重构我的类来使用dependency injection
或者不在当前的类/特性中设置val
,所以我可以模拟val
。