我将采用蛋糕模式,您可以在最后一刻混合实现:
trait MyService extends HttpService with FooService {
val route =
path("SomePath") { id =>
get { requestContext =>
val fooService = actorRefFactory.actorOf(fooProps(requestContext))
queryService ! SomeMessage(id)
}
}
}
trait FooService {
def fooProps(requestContext: RequestContext): Props
}
trait TestFooService extends FooService {
def fooProps(requestContext: RequestContext) =
Props(new TestFooService(requestContext))
}
trait ProdFooService extends FooService {
def fooProps(requestContext: RequestContext) =
Props(new FooService(requestContext))
}
trait MyTestService extends MyService with TestFooService
trait MyProdService extends MyService with ProdFooService
我是在文本编辑器中编写的,所以我不确定它是否能编译。
如果您想在没有参与者的情况下进行测试,可以提取以下两行:
val fooService = actorRefFactory.actorOf(fooProps(requestContext))
queryService ! SomeMessage(id)
用某种方法隐藏一个演员。例如:
def processRequest[T](msg: T): Unit = {
// those 2 lines, maybe pass other args here too like context
}
该方法可以以相同的蛋糕模式覆盖,对于测试,您甚至可以完全避免使用参与者。