主要想法:我们如何进行单元测试(或重新考虑以促进单元测试)Akka演员具有相当复杂的业务逻辑?
我一直在使用Akka为我公司的一个项目(一些非常基本的东西正在制作中)并不断重新考虑我的演员,研究和试验Akka测试工具包,看看我能否做到正确...
基本上,我随便做的大部分阅读都是"男人,你需要的只是测试工具包.如果你使用的是模拟,你做错了!!" 然而,文档和示例是如此轻松,以至于我发现了一些未涵盖的问题(基本上他们的示例是非常有用的类,它们有1个方法并且不与其他actor交互,或者只是以简单的方式,比如方法结束时的输入输出).顺便说一句,如果任何人都可以指向一个具有任何合理复杂程度的akka应用程序的测试套件,我真的很感激.
在这里,我现在至少会尝试详细说明一些特定情况,并想知道一个人称之为"Akka认证"的方法(但请不要含糊其辞......我正在寻找Roland Kuhn风格的方法,如果他是实际上深入研究具体问题).我将接受涉及重构的策略,但请注意我在场景中提到的对此的焦虑.
场景1:横向方法(在同一个角色中调用另一个方法的方法)
case class GetProductById(id : Int)
case class GetActiveProductsByIds(ids : List[Int])
class ProductActor(val partsActor : ActorRef, inventoryActor : ActorRef) extends Actor {
override def receive: Receive = {
case GetProductById(pId) => pipe(getProductById(pId)) to sender
case GetActiveProductsByIds(pIds) => pipe(getActiveProductsByIds(pIds)) to sender
}
def getProductById(id : Int) : Future[Product] = {
for {
// Using pseudo-code here
parts <- (partsActor ? GetPartsForProduct(id)).mapTo[List[Part]]
instock <- (inventoryActor ? StockStatusRequest(id)).mapTo[Boolean]
product <- Product(parts, instock)
} yield product
} …Run Code Online (Sandbox Code Playgroud)