当涉及隐式参数时,我很难理解如何在 Scala 中编写测试。
我的代码和测试有以下(短版):
实现(Scala 2.10、Spray 和 Akka):
import spray.httpx.SprayJsonSupport._
import com.acme.ResultJsonFormat._
case class PerRequestIndexingActor(ctx: RequestContext) extends Actor with ActorLogging {
def receive = LoggingReceive {
case AddToIndexRequestCompleted(result) =>
ctx.complete(result)
context.stop(self)
}
}
object ResultJsonFormat extends DefaultJsonProtocol {
implicit val resultFormat = jsonFormat2(Result)
}
case class Result(code: Int, message: String)
测试(使用 ScalaTest 和 Mockito):
"Per Request Indexing Actor" should {
"send the HTTP Response when AddToIndexRequestCompleted message is received" in {
val request = mock[RequestContext]
val result = mock[Result]
val perRequestIndexingActor = TestActorRef(Props(new PerRequestIndexingActor(request)))
perRequestIndexingActor ! AddToIndexRequestCompleted(result)
verify(request).complete(result)
}
}
此行verify(request).complete(result)
使用隐式 Marshaller 转换Result
为 JSON。
我可以通过添加将 marshaller 带入范围,implicit val marshaller: Marshaller[Result] = mock[Marshaller[Result]]
但是当我运行测试时,使用了不同的 Marshaller 实例,因此验证失败。
即使明确地将模拟 Marshaller 传递给complete
失败。
那么,任何人都可以建议如何为隐式参数创建一个模拟对象并确保使用该实例吗?