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

Sye*_*hiq 11 java unit-testing jax-rs grizzly jersey-2.0

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

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

@GET
@Path("/my_path")
@Produces(MediaType.TEXT_XML)
public String webserviceRequest(@Context UriInfo uriInfo);
Run Code Online (Sandbox Code Playgroud)

Pau*_*tha 12

您只需使用@Context注释注入它,作为字段或方法参数.

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

    public Response doSomthing(@Context UriInfo uriInfo) {

    }
}
Run Code Online (Sandbox Code Playgroud)

除了你的资源类,它也可以被注入到其它供应商一样ContainerRequestContext,ContextResolver,MessageBodyReader等.

编辑

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

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

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

  2. 使用像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);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    您需要添加此依赖项

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>1.9.0</version>
    </dependency>
    
    Run Code Online (Sandbox Code Playgroud)

如果你想进行集成测试,注入实际的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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

只需添加此依赖项

<dependency>
    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
    <artifactId>jersey-test-framework-provider-inmemory</artifactId>
    <version>${jersey2.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

它使用内存容器,这对于小型测试来说效率最高.如果需要,还有其他具有Servlet支持的容器.只需看看我上面发布的链接.