6

我想在我的控制器中测试我的一种 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控制器方法进行一些简单的测试吗?

4

2 回答 2

2

为了测试你的休息服务,首先你应该启动一个假的应用程序。

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

在你的测试结束时,建议停止它

    stop(fakeApplication);

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

FakeApplication fakeApplication = fakeApplication();

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

@After
public void afterTest() {
    stop(fakeApplication);
}
于 2015-02-13T16:23:47.963 回答
0

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

请参阅有关如何在 Play 2 中获取身份验证 cookie 的答案: https ://stackoverflow.com/a/13953375/286550

于 2013-04-30T22:15:01.843 回答