早上好,
我正在尝试在我的控制器上测试一些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)));
}
我尝试了几种解决方案,但我找不到合适的解决方案:
那么,为我的控制器编写测试的最佳方法是什么?
我正在使用Play Framework 2.4.6和Java。 Junit 4和Mockito。
答案 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);
}
}