在PlayFramework 2.4.x上测试POST请求

时间:2016-02-08 08:45:12

标签: java testing playframework

早上好,

我正在尝试在我的控制器上测试一些POST请求。

我对GET请求没有任何问题:

@Test
public void testGetAll() {
    TestModel test = new TestModel();
    test.done = true;
    test.name = "Pierre";
    test.save();

    TestModel test2 = new TestModel();
    test2.done = true;
    test2.name = "Paul";
    test2.save();

    Result result = new controllers.ressources.TestRessource().get(null);
    assertEquals(200, result.status());
    assertEquals("text/plain", result.contentType());
    assertEquals("utf-8", result.charset());
    assertTrue(contentAsString(result).contains("Pierre"));
    assertTrue(contentAsString(result).contains("Paul"));
}

但是当我必须测试POST请求时,我无法将POST参数提供给控制器。

这是我要测试的方法:

public Result post() {
    Map<String, String> params =     RequestUtils.convertRequestForJsonDecode(request().queryString());

    T model = Json.fromJson(Json.toJson(params), genericType);
    model.save();

    reponse.setData(model);
    return ok(Json.prettyPrint(Json.toJson(reponse)));
}

我尝试了几种解决方案,但我找不到合适的解决方案:

  • 尝试使用FakeRequest
  • 尝试模拟Http.Request对象

那么,为我的控制器编写测试的最佳方法是什么?

我正在使用Play Framework 2.4.6和Java。 Junit 4和Mockito。

1 个答案:

答案 0 :(得分:2)

对于POST动作的测试,我使用RequestBuilder和play.test.Helpers.route方法。

对于有JSON数据的人来说,它可能看起来像这样(我使用Jackson的ObjectMapper进行编组):

public class MyTests {

  protected Application application;

  @Before
  public void startApp() throws Exception {
    ClassLoader classLoader = FakeApplication.class.getClassLoader();
    application = new GuiceApplicationBuilder().in(classLoader)
            .in(Mode.TEST).build();
    Helpers.start(application);
  }

  @Test
  public void myPostActionTest() throws Exception {

    JsonNode jsonNode = (new ObjectMapper()).readTree("{ \"someName\": \"sameValue\" }");
    RequestBuilder request = new RequestBuilder().method("POST")
            .bodyJson(jsonNode)
            .uri(controllers.routes.MyController.myAction().url());
    Result result = route(request);

    assertThat(result.status()).isEqualTo(OK);
  }

  @After
  public void stopApp() throws Exception {
    Helpers.stop(application);
  }
}