我正在开发一个轻量级服务器应用程序,其中包含一个使用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框架中相当新。有没有人可以指出我最近的任何文档,示例,或者只是在这里解释如何让它工作?
答案 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提供者。