Play框架 - 测试POST控制器方法

时间:2013-04-21 00:04:41

标签: java unit-testing playframework-2.1

我想在我的控制器中测试一个POST方法,所以我写了这样的东西:

@Test
    public void shouldSaveNewCollectionToDatabase(){
        String body = "{\"name\":\"collectionName\", \"owner\": {}}";
        JsonNode json = Json.parse(body);
        FakeRequest request = new FakeRequest(POST, "/rest/collections/add").withJsonBody(json);

        Result result = callAction(controllers.routes.ref.SetsAndCollections.postCollection(), request);
        verify(questionSetCollectionDAO).save(any(QuestionSetCollection.class));
    }
事实是,这个测试失败了,因为根本没有调用控制器方法,所以我的questionSetCollectionDAO方法没有被调用。

我的事件在方法的顶部放了一些打印:

@BodyParser.Of(Json.class)
@play.db.jpa.Transactional
public static Result postCollection(){
    System.out.println("I am here");
...

我在控制台上看不到任何输出。

如果这不是我用虚假请求调用控制器方法的方式,我该怎么做?

我读到了fakeApplication但我还有其他方法可以对POST控制器方法进行一些简单的测试吗?

2 个答案:

答案 0 :(得分:2)

为了测试你的休息服务,首先你应该开始假的应用程序。

FakeApplication fakeApplication=fakeApplication();
start(fakeApplication);

在测试结束时,建议停止测试

    stop(fakeApplication);

如果您有许多测试方法,可以在测试类中添加这些方法以方便测试过程。

FakeApplication fakeApplication = fakeApplication();

@Before
public void beforeTest() {
    start(fakeApplication);
}

@After
public void afterTest() {
    stop(fakeApplication);
}

答案 1 :(得分:0)

您可以打印出结果的http状态代码吗?如果它是303重定向 - 它听起来像是(因为控制器没有被调用),很可能你需要提供一个登录播放会话cookie来执行POST方法。

请参阅此答案,了解如何在Play 2中获取身份验证Cookie:https://stackoverflow.com/a/13953375/286550