首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与泽西客户端API一起使用修补程序进行单元测试

与泽西客户端API一起使用修补程序进行单元测试
EN

Stack Overflow用户
提问于 2015-04-07 18:55:52
回答 4查看 11.7K关注 0票数 7

我正在使用泽西岛开发REST实现。对于PATCH (部分更新),我已经实现了自己的PATCH自定义实现,因为泽西不支持它。

现在,我正试图弄清楚如何围绕该实现编写功能测试。我正在为其他方法(PUTPOSTGETDELETE)使用jersey测试框架,这些方法在该框架中提供了这种支持。

有什么方法可以扩展jersey测试框架实现来编写PATCH的功能测试呢?如果没有,我是否可以使用其他测试框架来测试泽西PATCH实现?

如果有人能提供任何例子,那就太好了。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-04-08 01:39:00

假设您的实现由这样的自定义注释组成

代码语言:javascript
运行
复制
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.ws.rs.HttpMethod;

@HttpMethod("PATCH")
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PATCH {}

试图用Client来做这样的事情

代码语言:javascript
运行
复制
 String response = target.request().method("PATCH", Entity.text("Hello"), String.class);

默认情况下不支持,并且将出现类似的异常

代码语言:javascript
运行
复制
java.net.ProtocolException: Invalid HTTP method: PATCH

这不是Client API的直接问题,而是低级Java的问题。似乎是某种安全限制。

使用客户端API,我们可以通过设置一个属性来覆盖它。

JerseyTest中,配置Client的一种方法是重写configureClient,并使用ClientConfig设置属性。您也可以轻松地在Client本身上设置属性,但是保持JerseyTest框架的精神(在这里我们不需要显式地访问Client,下面的示例将只是重写方法)

代码语言:javascript
运行
复制
public class PatchTest extends JerseyTest {

    @Path("patch")
    public static class PatchResource {
        @PATCH
        @Produces(MediaType.TEXT_PLAIN)
        public String getPatch(String request) {
            return "Patched " + request;
        }
    }

    @Override
    protected void configureClient(final ClientConfig config) {
        config.property(HttpUrlConnectorProvider.SET_METHOD_WORKAROUND, true);
    }

    @Override
    public Application configure() {
        return new ResourceConfig(PatchResource.class);
    }

    @Test
    public void doPatchTest() {
        WebTarget target = target("patch");
        String response = target.request().method("PATCH", Entity.text("Hello"), String.class);
        Assert.assertEquals("Patched Hello", response);
        System.out.println(response);
    }
}
票数 6
EN

Stack Overflow用户

发布于 2016-03-29 16:20:30

要通过HTTP PATCH发送JAX RS Client API而不需要任何额外的配置:

代码语言:javascript
运行
复制
 client.target("$baseUrl$restUsersUrl/$userId")
                .request("application/json")
                .build("PATCH", Entity.entity(json2Update, MediaType.APPLICATION_JSON))
                .invoke()
票数 4
EN

Stack Overflow用户

发布于 2017-11-19 20:11:44

注释@PATCH现在可以在JAX-RS2.1中使用。您可以在服务器端实现此HTTP方法,如:

代码语言:javascript
运行
复制
@PATCH
public Response updateResource() { ... } 

至于客户端,您可以这样做:

代码语言:javascript
运行
复制
Response r = ClientBuilder.newClient()
    .target("http://localhost:8080/patch")
    .request()
    .build("PATCH", Entity.text("patch"))
    .property(HttpUrlConnectorProvider.SET_METHOD_WORKAROUND, true)
    .invoke();

其中使用SET_METHOD_WORKAROUND来避免协议异常,如@peeskillet所示:

代码语言:javascript
运行
复制
java.net.ProtocolException: Invalid HTTP method: PATCH
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29499106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档