Ich habe eine harte Zeit zu versuchen, zu verstehen, wie man Tests in Scala schreibt, wenn implizite Parameter beteiligt sind.Scala testet implizite implizite Parameter?
ich folgende (Kurzfassung) habe von meinem Code und Test:
Implementation (Scala 2.10, Spray und 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)
Test (Mit ScalaTest und 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)
}
}
Diese Zeile verify(request).complete(result)
verwendet einen impliziten Marshaller, um Result
in JSON umzuwandeln.
Ich kann einen Marshaller in den Geltungsbereich bringen, indem ich implicit val marshaller: Marshaller[Result] = mock[Marshaller[Result]]
hinzufüge, aber wenn ich den Test ausführe, wird eine andere Instanz von Marshaller verwendet, so dass die Überprüfung fehlschlägt.
Selbst die explizite Weitergabe des Pseudo-Marshallers an complete
schlägt fehl.
Also, kann jemand beraten, wie man ein Mock-Objekt für einen impliziten Parameter erstellen und sicherstellen, dass die Instanz verwendet wird?
Wie funktioniert das explizite Übergeben des Mocks? Warum solltest du überhaupt einen Mocksalber benutzen? (Ich habe kein Mockito benutzt, also entschuldige bitte, wenn das dumme Fragen sind) – jrudolph