JerseyTest WebTarget POST支持

Ger*_*ert 3 junit jersey jackson

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

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

基于Jersey文档中的示例,我的查询参数的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);
    }

}
Run Code Online (Sandbox Code Playgroud)

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

Response response = theTarget.request().post( Entity.entity(UserCredentialsBean.class, "application/json"));
Run Code Online (Sandbox Code Playgroud)

不起作用.

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

Ger*_*ert 5

在我在这里发布我的问题之前,我确实做了很多谷歌搜索,但在检查后,我的眼睛突然落在这个相关问题上.我曾多次搜索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
        );

    }

}
Run Code Online (Sandbox Code Playgroud)

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

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