2017-05-09 1 views
0

Cette question est une extension du problème résolu mentionné au https://github.com/paulbutcher/ScalaMock/issues/79Scalamock: Impossible de fonction simulée avec paramètre typé et plusieurs variables implicites

Je le trait suivant à la maquette:

trait HttpClient{ 
    def deserialize[T](response: HttpResponse) 
        (implicit um: Unmarshaller[ResponseEntity, T], 
        executionContext: ExecutionContext): Future[T] 
} 

Je suis en essayant de se moquer de la HttpClient comme suit

val client = mock[HttpClient] 

case class SomeTypeT(name:String, id:Int) 
implicit val someTypeTFormat = jsonFormat2(SomeTypeT) // to be able to marshal and unmarshal from JSON 

(httpClient.deserialize[SomeTypeT](_: HttpResponse)) 
.expects(where { 
    (response: HttpResponse) => { 
    response.entity == ent 
    } 
}) 
.returns(Unmarshal(response.entity).to[SomeTypeT]) 

le problème se produit lorsque je tente de se moquer de la fonction deserialize. Comme ci-dessus, la méthode deserialize est constituée d'un paramètre typé T et d'un paramètre unique de type HttpResponse, et de 2 autres paramètres implicites utilisés lors du démariage de la réponse.

La question, par conséquent, est de savoir comment utiliser ScalaMock pour simuler la fonction deserialize et spécifier plusieurs paramètres implicites tout en se moquant. Cela ne fonctionne pas

// Both UnMarshaller & ExecutionContext are available here as implicits 
(httpClient.deserialize[SomeTypeT](_: HttpResponse)(_: Unmarshaller[ResponseEntity, SomeTypeT](_: ExecutionContext)) 

Le problème est que je ne peux pas utiliser _ pour spécifier les paramètres implicites. Et je ne sais pas comment y parvenir. S'il vous plaît aider comment se moquer de la fonction

donné que je utilise les bibliothèques suivantes:

  • version 2.11.8 scala
  • version 3.0.0 scalatest
  • scalamock Version 3.5.0

Alors que la seconde tentative ne compile pas même en raison de plusieurs _ utilisés, le premier entraîne l'exception suivante:

org.scalamock.function.MockFunction3 cannot be cast to org.scalamock.function.MockFunction1 
java.lang.ClassCastException: org.scalamock.function.MockFunction3 cannot be cast to org.scalamock.function.MockFunction1 

Répondre

1

Après la réponse à GitHub que vous LIÉ, votre code devrait être quelque chose comme

(httpClient.deserialize[SomeTypeT](_: HttpResponse)(_: Unmarshaller[ResponseEntity, SomeTypeT], _:ExecutionContext)) 
.expects(where { 
    (response: HttpResponse, _: Unmarshaller[ResponseEntity, SomeTypeT], _:ExecutionContext) => { 
    response.entity == ent 
    } 
}) 
.returns(Unmarshal(response.entity).to[SomeTypeT]) 

à savoir vous placez explicitement des espaces réservés pour les paramètres implicites dans l'appel en tant que deuxième groupe de paramètres et dans le where en tant que paramètres supplémentaires après tout non-implicite.

+0

Merci beaucoup. Il me manquait d'ajouter les mêmes paramètres implicites dans l'instruction where comme vous l'avez souligné à juste titre. – Agraj