gpt4 book ai didi

junit - JerseyTest WebTarget POST 支持

转载 作者:行者123 更新时间:2023-12-05 01:35:32 29 4
gpt4 key购买 nike

我正在使用 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 框架中是相当新的。有没有人可以向我指出任何最近的文档、示例,或者只是在这里解释我如何让它工作?

最佳答案

在我在这里发布我的问题之前,我确实做了很多谷歌搜索,但在查看之后我的目光突然落在了这个 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 的编码由框架完成,由作为 JSON 提供者的 moxy 或 jackson 完成。

关于junit - JerseyTest WebTarget POST 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25887566/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com