我正在使用 Jersey 实现 REST API。对于 PATCH
(部分更新),我实现了自己的 PATCH
自定义实现,因为 Jersey 不支持它。
现在我正试图弄清楚如何围绕该实现编写功能测试。我正在将 Jersey 测试框架用于具有该支持的其他方法(PUT
、POST
、GET
、DELETE
)在该框架中可用。
有没有一种方法可以扩展 Jersey 测试框架实现来为 PATCH
编写我的功能测试?
如果没有,是否有任何其他可用的测试框架可用于测试我的 Jersey PATCH
实现?
如果有人能提供任何示例,那就太好了。
最佳答案
假设您的实现包含这样的自定义注释
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
做这样的事情
String response = target.request().method("PATCH", Entity.text("Hello"), String.class);
默认是不支持的,会抛出异常
java.net.ProtocolException: Invalid HTTP method: PATCH
这不是直接与 Client
API 相关的问题,而是与较低级别的 Java API 相关的问题。似乎是一些安全限制。
使用客户端 API,我们可以通过设置属性来覆盖它
在 JerseyTest
中,配置 Client
的一种方法是覆盖 configureClient
,并使用 ClientConfig< 设置属性
。您可以轻松地在 Client
本身上设置属性,但要保持 JerseyTest
框架的精神(我们不需要显式访问 客户端
,下面的例子只是覆盖方法
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);
}
}
关于java - 使用 PATCH 和 Jersey Client API 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29499106/