如何获取 javax.ws.rs.core.UriInfo 的实例
How to get instance of javax.ws.rs.core.UriInfo
是否有 javax.ws.rs.core.UriInfo
的任何实现,我可以使用它来快速创建实例以进行测试。这个界面很长,我只是想测试一下。我不想在这个接口的整个实现上浪费时间。
更新:我想为类似于此的函数编写单元测试:
@GET
@Path("/my_path")
@Produces(MediaType.TEXT_XML)
public String webserviceRequest(@Context UriInfo uriInfo);
您只需使用 @Context
注释将其作为字段或方法参数注入即可。
@Path("resource")
public class Resource {
@Context
UriInfo uriInfo;
public Response doSomthing(@Context UriInfo uriInfo) {
}
}
除了您的资源 类,它还可以注入其他供应商,如 ContainerRequestContext
、ContextResolver
、MessageBodyReader
等
编辑
Actually I want to write a junit test for a function similar to your doSomthing() function.
我没有在你的 post 中找到它。但是我可以想到一些用于单元测试的选项
只需创建一个存根,只实现您使用的方法。
使用像 Mockito 这样的 Mocking 框架,并模拟 UriInfo
。范例
@Path("test")
public class TestResource {
public String doSomthing(@Context UriInfo uriInfo){
return uriInfo.getAbsolutePath().toString();
}
}
[...]
@Test
public void doTest() {
UriInfo uriInfo = Mockito.mock(UriInfo.class);
Mockito.when(uriInfo.getAbsolutePath())
.thenReturn(URI.create("http://localhost:8080/test"));
TestResource resource = new TestResource();
String response = resource.doSomthing(uriInfo);
Assert.assertEquals("http://localhost:8080/test", response);
}
您需要添加此依赖项
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.0</version>
</dependency>
如果你想做一个集成测试,在注入实际 UriInfo 的地方,你应该查看
这是 Jersey 测试框架的完整示例
public class ResourceTest extends JerseyTest {
@Path("test")
public static class TestResource {
@GET
public Response doSomthing(@Context UriInfo uriInfo) {
return Response.ok(uriInfo.getAbsolutePath().toString()).build();
}
}
@Override
public Application configure() {
return new ResourceConfig(TestResource.class);
}
@Test
public void test() {
String response = target("test").request().get(String.class);
Assert.assertTrue(response.contains("test"));
}
}
只需添加此依赖项
<dependency>
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
<artifactId>jersey-test-framework-provider-inmemory</artifactId>
<version>${jersey2.version}</version>
</dependency>
它使用内存容器,这对于小型测试是最有效的。如果需要,还有其他支持 Servlet 的容器。请参阅上面 post 编辑的 link。
你要么模拟它,要么使用类似 http://arquillian.org/
的东西
我正在编写集成测试,所以不能使用 mock 东西
我使用了一些球衣测试代码
WebApplicationImpl wai = new WebApplicationImpl();
ContainerRequest r = new TestHttpRequestContext(wai,
"GET", null,
"/mycontextpath/rest/data", "/mycontextpath/");
UriInfo uriInfo = new WebApplicationContext(wai, r, null);
myresources.setUriInfo(uriInfo);
和
private static class TestHttpRequestContext extends ContainerRequest {
public TestHttpRequestContext(
WebApplication wa,
String method,
InputStream entity,
String completeUri,
String baseUri) {
super(wa, method, URI.create(baseUri), URI.create(completeUri), new InBoundHeaders(), entity);
}
}
如果您收到有关请求范围 bean 的任何错误,请参阅 request scoped beans in spring testing
是否有 javax.ws.rs.core.UriInfo
的任何实现,我可以使用它来快速创建实例以进行测试。这个界面很长,我只是想测试一下。我不想在这个接口的整个实现上浪费时间。
更新:我想为类似于此的函数编写单元测试:
@GET
@Path("/my_path")
@Produces(MediaType.TEXT_XML)
public String webserviceRequest(@Context UriInfo uriInfo);
您只需使用 @Context
注释将其作为字段或方法参数注入即可。
@Path("resource")
public class Resource {
@Context
UriInfo uriInfo;
public Response doSomthing(@Context UriInfo uriInfo) {
}
}
除了您的资源 类,它还可以注入其他供应商,如 ContainerRequestContext
、ContextResolver
、MessageBodyReader
等
编辑
Actually I want to write a junit test for a function similar to your doSomthing() function.
我没有在你的 post 中找到它。但是我可以想到一些用于单元测试的选项
只需创建一个存根,只实现您使用的方法。
使用像 Mockito 这样的 Mocking 框架,并模拟
UriInfo
。范例@Path("test") public class TestResource { public String doSomthing(@Context UriInfo uriInfo){ return uriInfo.getAbsolutePath().toString(); } } [...] @Test public void doTest() { UriInfo uriInfo = Mockito.mock(UriInfo.class); Mockito.when(uriInfo.getAbsolutePath()) .thenReturn(URI.create("http://localhost:8080/test")); TestResource resource = new TestResource(); String response = resource.doSomthing(uriInfo); Assert.assertEquals("http://localhost:8080/test", response); }
您需要添加此依赖项
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <version>1.9.0</version> </dependency>
如果你想做一个集成测试,在注入实际 UriInfo 的地方,你应该查看
这是 Jersey 测试框架的完整示例
public class ResourceTest extends JerseyTest {
@Path("test")
public static class TestResource {
@GET
public Response doSomthing(@Context UriInfo uriInfo) {
return Response.ok(uriInfo.getAbsolutePath().toString()).build();
}
}
@Override
public Application configure() {
return new ResourceConfig(TestResource.class);
}
@Test
public void test() {
String response = target("test").request().get(String.class);
Assert.assertTrue(response.contains("test"));
}
}
只需添加此依赖项
<dependency>
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
<artifactId>jersey-test-framework-provider-inmemory</artifactId>
<version>${jersey2.version}</version>
</dependency>
它使用内存容器,这对于小型测试是最有效的。如果需要,还有其他支持 Servlet 的容器。请参阅上面 post 编辑的 link。
你要么模拟它,要么使用类似 http://arquillian.org/
的东西我正在编写集成测试,所以不能使用 mock 东西
我使用了一些球衣测试代码
WebApplicationImpl wai = new WebApplicationImpl();
ContainerRequest r = new TestHttpRequestContext(wai,
"GET", null,
"/mycontextpath/rest/data", "/mycontextpath/");
UriInfo uriInfo = new WebApplicationContext(wai, r, null);
myresources.setUriInfo(uriInfo);
和
private static class TestHttpRequestContext extends ContainerRequest {
public TestHttpRequestContext(
WebApplication wa,
String method,
InputStream entity,
String completeUri,
String baseUri) {
super(wa, method, URI.create(baseUri), URI.create(completeUri), new InBoundHeaders(), entity);
}
}
如果您收到有关请求范围 bean 的任何错误,请参阅 request scoped beans in spring testing