У меня немного трудное время, пытаясь понять, как писать тесты в Scala, когда задействованы неявные параметры.Scala тестирует насмешливые неявные параметры?
У меня есть следующий (короткая версия) моего кода и тестирования:
реализации (Scala 2,10, спрей и Акка):
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)
Test (Использование 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)
использует неявный маршаллер, чтобы превратить Result
в JSON.
Я могу привести маршаллера в область видимости, добавив implicit val marshaller: Marshaller[Result] = mock[Marshaller[Result]]
, но когда я запускаю тест, используется другой экземпляр Marshaller, поэтому проверка не выполняется.
Даже явно пропуская макет Маршаллера до complete
не удается.
Итак, может ли кто-нибудь посоветовать создать макет объекта для неявного параметра и убедиться, что экземпляр используется?
Как явно пропустить неудачу? Почему вы хотите использовать макет маршаллера в первую очередь? (Я не использовал mockito, поэтому, пожалуйста, извините меня, если это глупые вопросы) – jrudolph