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

更新:我想为此功能编写单元测试:

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

最佳答案

您只需将@Context注释作为字段或方法参数注入(inject)即可。

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

    public Response doSomthing(@Context UriInfo uriInfo) {

    }
}

除了您的资源类,它还可以注入(inject)到其他提供程序中,例如ContainerRequestContextContextResolverMessageBodyReader等。

编辑



我没有在您的帖子中讲到这一点。但是对于单元测试,我可以考虑几个选择
  • 只需创建一个 stub ,仅实现您使用的方法即可。
  • 使用类似于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>
    

  • 如果要进行集成测试,并在其中注入(inject)实际的UriInfo,则应查看Jersey Test Framework

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

    10-06 02:12