如何获取javax.ws.rs.core.UriInfo的实例

时间:2015-04-24 09:43:51

标签: java unit-testing jax-rs jersey-2.0 grizzly

是否有javax.ws.rs.core.UriInfo的任何实现可用于快速创建实例以进行测试。这个界面很长,我只需要测试一下。我不想在这个界面的整个实现上浪费时间。

更新:我想为类似的函数编写单元测试:

@GET
@Path("/my_path")
@Produces(MediaType.TEXT_XML)
public String webserviceRequest(@Context UriInfo uriInfo);

3 个答案:

答案 0 :(得分:11)

您只需将@Context注释作为字段或方法参数注入。

@Path("resource")
public class Resource {
    @Context
    UriInfo uriInfo;

    public Response doSomthing(@Context UriInfo uriInfo) {

    }
}

除资源类外,还可以将其注入其他提供商,例如ContainerRequestContextContextResolverMessageBodyReader等。

修改

  

实际上我想为类似于doSomthing()函数的函数编写junit测试。

我没有在你的帖子中选择那个。但是我可以想到几个单元测试选项

  1. 只需创建一个存根,只实现您使用的方法。

  2. 使用像Mockito这样的模拟框架,并模拟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>
    
  3. 如果你想进行集成测试,注入实际的UriInfo,你应该研究Jersey Test Framework

    以下是泽西测试框架的完整示例

    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支持的容器。只需看看我上面发布的链接。

答案 1 :(得分:0)

你要么嘲笑它,要么使用http://arquillian.org/

之类的东西

答案 2 :(得分:0)

我正在编写集成测试,因此无法使用模拟内容

我使用了一些代码进行球衣测试

http://www.programcreek.com/java-api-examples/index.php?source_dir=JerseyTest-master/jersey-tests/src/test/java/com/sun/jersey/impl/uri/UriPathHttpRequestTest.java

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