Mam trochę trudny czas próbując zrozumieć, jak pisać testy w Scala, gdy zaangażowane są niejawne parametry.Testowanie Scala kpiąca z ukrytych parametrów?
Mam następujący (krótka wersja) mojego kodu i testów:
Wdrażania (Scala 2.10, Spray i 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 (używając ScalaTest i 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)
}
}
Ta linia, verify(request).complete(result)
, używa domyślnego programu Marshaller, aby przekształcić Result
w JSON.
Mogę przyprowadzić koordynatora do zakresu, dodając implicit val marshaller: Marshaller[Result] = mock[Marshaller[Result]]
, ale po uruchomieniu testu jest używane inne wystąpienie programu Marshaller, więc weryfikacja nie powiedzie się.
Nawet przekazanie fałszywego kodu Marshaller do complete
nie powiedzie się.
Czy ktoś może doradzić, jak utworzyć fałszywy obiekt dla niejawnego parametru i upewnić się, że ta instancja jest używana?
Jak jawnie przechodzi próba? Dlaczego miałbyś chcieć użyć symulatora marshallera? (Nie użyłem mockito, więc przepraszam, jeśli to głupie pytania) – jrudolph