2017-03-29 1 views
0

J'ai une classe de service dans mon projet et je veux tester une de ses méthodes qui effectue un appel API, donc je veux attraper cet appel et le retourner ressemble à quelque chose de faux que je puisse tester ma méthode, ceci:get scheme java.lang.NullPointerException: schéma en essayant de simuler un appel de serveur dans mon service

class MyService @Inject()(implicit config: Configuration, wsClient: WSClient) { 

    def methodToTest(list: List[String]): Future[Either[BadRequestResponse, Unit]] = { 
    wsClient.url(url).withHeaders(("Content-Type", "application/json")).post(write(list)).map { response => 
     response.status match { 
     case Status.OK => 
      Right(logger.debug("Everything is OK!")) 
     case Status.BAD_REQUEST => 
      Left(parse(response.body).extract[BadRequestResponse]) 
     case _ => 
      val ex = new RuntimeException(s"Failed with status: ${response.status} body: ${response.body}") 
      logger.error(s"Service failed: ", ex) 
      throw ex 
     } 
    } 
    } 
} 

et maintenant dans ma classe de test, je vais:

class MyServiceTest extends FreeSpec with ShouldMatchers with OneAppPerSuite with ScalaFutures with WsScalaTestClient { 

    implicit lazy val materializer: Materializer = app.materializer 
    lazy val config: Configuration = app.injector.instanceOf[Configuration] 
    lazy val myService = app.injector.instanceOf[MyService] 

    "My Service Tests" - { 

    "Should behave as im expecting" in { 
     Server.withRouter() { 
     case POST(p"/fake/api/in/conf") => Action { request => 
      Results.Ok 
     } 
     } { implicit port => 
     WsTestClient.withClient { implicit client => 

      whenReady(myService.methodToTest(List("1","2","3"))) { res => 
      res.isRight shouldBe true 
      } 
     } 
     } 
    } 
    } 
} 

et je reçois cette erreur:

scheme java.lang.NullPointerException: scheme 

a également essayé mis sous client =>:

val myService = new MyService { 
     implicit val config: Configuration = configuration 
     implicit val ws: WSClient = client 
     } 

mais nous avons eu une autre erreur que je n'ai pas assez d'arguments dans le constructeur ...

pourquoi est-il ne fonctionne pas?

s'il y a une meilleure façon plus simple de deuxième faux cet appel api je vais aimer l'entendre :)

merci!

Répondre

1

Server.withRouter peut ne pas être exactement ce que vous voulez. Il crée un serveur et le lie à un port aléatoire, par instance (sauf si vous spécifiez le port). Il crée également sa propre instance d'application qui sera déconnectée de l'application que vous avez utilisée pour instancier le service.

Une autre chose est que l'WSClientinjecté ne fonctionne pas par rapport à votre application. Vous devez utiliser le client qui est passé au bloc WsTestClient.withClient à la place. Donc, vous devriez faire quelque chose comme:

class MyServiceTest extends FreeSpec with ShouldMatchers with OneAppPerSuite with ScalaFutures with WsScalaTestClient { 

    implicit lazy val materializer: Materializer = app.materializer 
    lazy val config: Configuration = app.injector.instanceOf[Configuration] 

    "My Service Tests" - { 

    "Should behave as im expecting" in { 
     Server.withRouter() { 
     case POST(p"/fake/api/in/conf") => Action { request => 
      Results.Ok 
     } 
     } { implicit port => 
     WsTestClient.withClient { implicit client => 

      // Use the client "instrumented" by Play. It will 
      // handle the relative aspect of the url. 
      val myService = new MyService(client, config) 

      whenReady(myService.methodToTest(List("1","2","3"))) { res => 
      res.isRight shouldBe true 
      } 
     } 
     } 
    } 
    } 
}