JerseyTest WebTarget POST支持

时间:2014-09-17 10:01:04

标签: junit jersey jackson

我正在开发一个轻量级服务器应用程序,其中包含一个使用Jersey 2.12和Jackson 2实现的RESTful api。

我在使用JUnit和JerseyTest开发时编写测试。我知道我的Jersey资源按预期工作,包括从JSON到JSON的编组,因为我使用PostMan Chrome插件手动测试它们。

根据Jersey documentation中的示例,使用查询参数进行的GET测试也能很好地运行 这是一个简化的(我遗漏了样板代码,以使想法更清晰)我想写的测试示例:

import static org.junit.Assert.assertTrue;

import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Response;

import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Test;

import com.acme.api.rest.SessionsEndPoint;
import com.acme.api.rest.beans.UserCredentialsBean;

public class TestSession extends JerseyTest {

    @Override
    protected Application configure() {
        return new ResourceConfig(SessionsEndPoint.class);
    }

    @Test
    public void test() {
        UserCredentialsBean userCredentialsBean = new UserCredentialsBean();
        userCredentialsBean.setUserId("alice");
        userCredentialsBean.setPassword("secret");
        WebTarget theTarget = target("sessions/login");
        Response response = theTarget.request().post( Entity.entity(UserCredentialsBean.class, "application/json"));
        assertTrue(true);
    }

}

我遇到的基本问题是我找不到任何关于如何正确使用WebTarget类进行帖子请求的文档。 WebTarget theTarget构造正确但行:

Response response = theTarget.request().post( Entity.entity(UserCredentialsBean.class, "application/json"));

不起作用。

据我所知,WebTarget类在JerseyTest框架中相当新。有没有人可以指出我最近的任何文档,示例,或者只是在这里解释如何让它工作?

1 个答案:

答案 0 :(得分:5)

在我在这里发布我的问题之前,我确实做了很多谷歌搜索,但在检查后,我的眼睛突然落在了Related Question上。我曾多次搜索SO,但从未发现过这个问题。无论如何,这是解决我问题的方法:

我按照接受的答案开始实施,并让它快速运作。

然后我决定你应该可以避免使用JSON字符串表示,并且我已经开始工作了。

上述代码如果修改如下:

import static org.junit.Assert.assertTrue;

import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Response;

import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Test;

import com.acme.api.rest.SessionsEndPoint;
import com.acme.api.rest.beans.UserCredentialsBean;

public class TestSession extends JerseyTest {

    @Override
    protected Application configure() {
        return new ResourceConfig(SessionsEndPoint.class);
    }

    @Test
    public void test() {
        UserCredentialsBean userCredentialsBean = new UserCredentialsBean();
        userCredentialsBean.setUserId("alice");
        userCredentialsBean.setPassword("secret");
        LoginResponseBean loginResponseBean = 
             target("sessions/login")
                 .request(MediaType.APPLICATION_JSON_TYPE)
                 .post(
                     Entity.entity(
                         userCredentialsBean,
                         MediaType.APPLICATION_JSON_TYPE
                     ),
                     LoginResponseBean.class
                 );
        assertTrue(
                loginResponseBean.isSuccess()
            &&
                loginResponseBean.getToken().length()==36
        );

    }

}

LoginResponseBean是一个普通的Java Bean。只是getter和setter以及默认构造函数。

来自JSON的编组是由框架完成的,由moxy或jackson作为JSON提供者。