2

Ich verwende Play Framework und verwende Java als Sprache der Wahl. Ich habe einen Controller, der einen REST-Anruf an einen externen Dienst macht. Ich beabsichtige, den externen Dienst zu verspotten, so dass ich die Funktionalität meines Controllers testen kann. Um dies zu erreichen, habe ich meine Testfälle wie unten gezeigt erstellt (Beispiel). Ich schließe einen Server in meinen Test ein, um den externen Dienst zu verspotten.Testen von Controllern im Play Framework

public class SomeControllerTest extends WithApplication { 

private static Server SERVER; 

@Override 
protected Application provideApplication() { 
    final Module testModule = new AbstractModule() { 
     @Override 
     public void configure() { 
      bind(AppDao.class).to(MockAppDaoImpl.class); 
     } 
    }; 
    return new GuiceApplicationBuilder().in(Environment.simple()).overrides(testModule).build(); 
} 

@BeforeClass 
public static void setup() { 
    Router router = new RoutingDsl() 
      .POST("/api/users") 
      .routeTo(() -> created()) 
      .build(); 
    SERVER = Server.forRouter(router, 33373); 
    PORT = SERVER.httpPort(); 
} 

@AfterClass 
public static void tearDown() { 
    SERVER.stop(); 
} 

@Test 
public void testCreateUser() { 
    ObjectNode obj = Json.newObject(); 
    obj.put("name", "John Doe"); 
    obj.put("email", "[email protected]"); 
    Http.RequestBuilder request = new Http.RequestBuilder() 
      .method(POST) 
      .bodyJson(obj) 
      .uri("/some/url/here"); 
    Result result = route(request); 
    assertEquals(ERR_MSG_STATUS_CODE, CREATED, result.status()); 
    assertEquals(ERR_MSG_CONTENT_TYPE, Http.MimeTypes.JSON, result.contentType().get()); 
} 

Meine Erwartung ist, dass, wenn ich den Test ausführen, meine Anwendung der Mock-Server läuft und würde, mein Controller mit dem Mock-Server basieren würde auf Testkonfiguration einen Anruf tätigen wird, die 201 und mein Testfall zurückkommen würde passieren . Aber das passiert nicht, denn sobald die Methode setup() abgeschlossen ist, wird der Mock-Server beendet, und mein Controller kann keinen Aufruf an sie senden.

Was mache ich hier falsch?

+0

Vielleicht können Sie mit 'Helpers.testServer();' den Server und dann 'Helpers.start (server);' starten. – Kris

+0

@Kris Wie würde ich den Router dem Testserver zur Verfügung stellen, der von den Helfern erstellt wurde? – Rishabh

+0

Sorry, habe es noch nie mit einem Router versucht. – Kris

Antwort

3

Prüfung der Controller eher durch Vererbung von WithApplication

public class TestController extends WithApplication { 
    @Test 
    public void testSomething() { 
     Helpers.running(Helpers.fakeApplication(),() -> { 
      // put test stuff 
      // put asserts 
     }); 
    } 

}

Um eine Controller-Methode zu testen Helpers.fakeRequest verwenden und Reverse-Routing erfolgen soll. Der externe Dienst kann nur mit Mockito oder anderen Spott-Framework verspottet werden.

Sie können here mehrere Beispiele finden.

+0

Vielen Dank für Ihre Eingabe und für den Link. Ich werde es ausprobieren müssen. Sobald ich finde, dass es wie erwartet funktioniert, werde ich es als richtige Antwort markieren. – Rishabh