unit-testingjunitplayframeworkplayframework-2.2playframework-2.3

Test HTTP response with PlayFramework/JUnit


I've been looking for hours to find a way to test if a route is correct with play.
I mean, for exemple

Is the GET request to localhost:9000/test actually return 200 OK?

I was not able to find any working example.


Solution

  • I use Play's WS (Web Services) library to achieve this. For Example:

    package endpoints;
    
    import com.fasterxml.jackson.databind.JsonNode;
    import models.Meh;
    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.junit.Test;
    import play.libs.Json;
    import play.libs.ws.WS;
    import play.libs.ws.WSResponse;
    import play.test.TestServer;
    
    import static org.fest.assertions.Assertions.assertThat;
    import static play.test.Helpers.*;
    
    public class MehEndpointTest {
    
        private static long timeout;
        private static Meh meh1;
        private static Meh meh2;
        // Test Server
        private static TestServer testServer = testServer(3333, fakeApplication(inMemoryDatabase()));
        private static JsonNode meh1Node;
        private static JsonNode meh2Node;
    
        @BeforeClass
        public static void setUp() {
            timeout = 10000L;
            // Dummy Objects
            meh1 = new Meh();
            meh1.meh = "foo";
            meh1.yo = "bar";
            meh2 = new Meh();
            meh2.meh = "hell";
            meh2.yo = "world";
            meh1Node = Json.toJson(meh1);
            meh2Node = Json.toJson(meh2);
            // Start the server
            start(testServer);
        }
    
        @Test
        public void testAdd() {
            WSResponse wsResponse1 = WS.url("http://localhost:3333/api/meh").post(meh1Node).get(timeout);
            WSResponse wsResponse2 = WS.url("http://localhost:3333/api/meh").post(meh2Node).get(timeout);
            JsonNode jsonNode1 = wsResponse1.asJson();
            JsonNode jsonNode2 = wsResponse2.asJson();
            assertThat(wsResponse1.getStatus()).isEqualTo(CREATED);
            assertThat(wsResponse2.getStatus()).isEqualTo(CREATED);
            assertThat(jsonNode1.isObject()).isEqualTo(true);
            assertThat(jsonNode1.get("id").asLong()).isEqualTo(1L);
            assertThat(jsonNode2.isObject()).isEqualTo(true);
            assertThat(jsonNode2.get("id").asLong()).isEqualTo(2L);
        }
    
        @Test
        public void testFind() {
            WSResponse wsResponse1 = WS.url("http://localhost:3333/api/meh").get().get(timeout);
            WSResponse wsResponse2 = WS.url("http://localhost:3333/api/meh/2").get().get(timeout);
            JsonNode jsonNode1 = wsResponse1.asJson();
            JsonNode jsonNode2 = wsResponse2.asJson();
            assertThat(wsResponse1.getStatus()).isEqualTo(OK);
            assertThat(wsResponse2.getStatus()).isEqualTo(OK);
            assertThat(jsonNode1.isArray()).isEqualTo(true);
            assertThat(jsonNode2.isObject()).isEqualTo(true);
            assertThat(jsonNode1).hasSize(2);
            assertThat(jsonNode2.get("id").asLong()).isEqualTo(2);
        }
    
        @Test
        public void testUpdate() {
            meh1.id = 1L;
            meh1.yo = "changed yo";
            WSResponse wsResponse1 = WS.url("http://localhost:3333/api/meh/1").put(Json.toJson(meh1)).get(timeout);
            JsonNode jsonNode1 = wsResponse1.asJson();
            assertThat(wsResponse1.getStatus()).isEqualTo(OK);
            assertThat(jsonNode1.isObject()).isEqualTo(true);
            assertThat(jsonNode1.get("id").asLong()).isEqualTo(1);
            assertThat(jsonNode1.get("yo").asText()).isEqualTo("changed yo");
        }
    
        @Test
        public void testDelete() {
            WSResponse wsResponse1 = WS.url("http://localhost:3333/api/meh").post(meh1Node).get(timeout);
            WSResponse wsResponse2 = WS.url("http://localhost:3333/api/meh/3").delete().get(timeout);
            WSResponse wsResponse3 = WS.url("http://localhost:3333/api/meh").get().get(timeout);
            JsonNode jsonNode1 = wsResponse3.asJson();
            assertThat(wsResponse1.getStatus()).isEqualTo(CREATED);
            assertThat(wsResponse2.getStatus()).isEqualTo(OK);
            assertThat(wsResponse3.getStatus()).isEqualTo(OK);
            assertThat(jsonNode1).hasSize(2);
        }
    
        @AfterClass
        public static void tearDown() {
            // Stop the server
            stop(testServer);
        }
    }
    

    Notice the calls to assertThat(wsResponse1.getStatus()).isEqualTo(OK);

    Hope that helps. Leave a comment if you need further clarification.