2017-03-29 5 views
0

Ich habe eine Serviceklasse in meinem Projekt, und ich möchte eine seiner Methoden testen, die einen API-Aufruf durchführt, also möchte ich fangen diese Verbindung und gehen etwas vortäuschen, damit ich meine Methode testen, es sieht wie folgt aus:Erhalten Schema java.lang.NullPointerException: Schema beim Versuch, einen Server Anruf in meinem Dienst zu fälschen

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 
     } 
    } 
    } 
} 

und jetzt in meinem Test-Klasse-I gehen:

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 
      } 
     } 
     } 
    } 
    } 
} 

und ich bekomme diese Fehlermeldung:

scheme java.lang.NullPointerException: scheme 

versucht auch unter Client setzen =>:

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

bekam aber einen anderen Fehler, die ich habe in den Konstruktor genug Argumente nicht ...

warum funktioniert es nicht?

, wenn es eine bessere nd einfacher Weg, dies api Anruf zu fälschen wird gerne höre ich es :)

Dank!

Antwort

1

Server.withRouter kann nicht genau sein, was Sie wollen. Es erstellt einen Server und bindet ihn an einen zufälligen Port pro Instanz (es sei denn, Sie geben den Port an). Es erstellt auch eine eigene Instanz der Anwendung, die getrennt von der App ist, die Sie verwendet haben, um den Dienst zu instanziieren.

Eine andere Sache ist, dass die injizierte WSClientnicht relativ zu Ihrer Anwendung funktioniert. Sie müssen stattdessen die client verwenden, die an WsTestClient.withClient Block übergeben wird. Also sollten Sie etwas tun wie:

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 
      } 
     } 
     } 
    } 
    } 
} 
Verwandte Themen