结合使用PATCH和Jersey Client API进行单元测试

Sac*_*hin 6 java rest jax-rs http-patch jersey-2.0

我正在使用Jersey进行REST API实现。对于PATCH(部分更新),我已经实现了自己的自定义实现,PATCH因为Jersey不支持它。

现在,我试图弄清楚如何围绕该实现编写功能测试。我使用的球衣测试框架,其他方法(PUTPOSTGETDELETE)已在该框架提供了支持。

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

如果有人可以提供任何示例,那就太好了。

Pau*_*tha 5

假设您的实现包含这样的自定义注释

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 {}
Run Code Online (Sandbox Code Playgroud)

试图用 Client

 String response = target.request().method("PATCH", Entity.text("Hello"), String.class);
Run Code Online (Sandbox Code Playgroud)

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

java.net.ProtocolException: Invalid HTTP method: PATCH
Run Code Online (Sandbox Code Playgroud)

这不是Client直接使用API的问题,而是使用较低级别的 Java API 的问题。似乎是一些安全限制。

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

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)