Как получить экземпляр javax.ws.rs.core.UriInfo

Есть ли реализация javax.ws.rs.core.UriInfo, которую я могу использовать для быстрого создания экземпляра для тестирования. Этот интерфейс длинный, мне просто нужно кое-что протестировать. Я не хочу тратить время на полную реализацию этого интерфейса.

ОБНОВЛЕНИЕ: я хочу написать модульный тест для функции, подобной этой:

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

person Syed Aqeel Ashiq    schedule 24.04.2015    source источник


Ответы (3)


Вы просто вводите его с аннотацией @Context в качестве параметра поля или метода.

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

    public Response doSomthing(@Context UriInfo uriInfo) {

    }
}

Помимо ваших классов ресурсов, его также можно внедрить в других поставщиков, таких как ContainerRequestContext, ContextResolver, MessageBodyReader и т. д.

РЕДАКТИРОВАТЬ

На самом деле я хочу написать junit-тест для функции, похожей на вашу функцию doSomthing().

Я не уловил этого в вашем посте. Но я могу придумать пару вариантов для модульных тестов

  1. Просто создайте заглушку, реализуя только используемые вами методы.

  2. Используйте фреймворк Mocking, например 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>
    

Если вы хотите выполнить интеграционный тест, в который вводится фактический 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>

Он использует контейнер в памяти, который наиболее эффективен для небольших тестов. При необходимости есть и другие контейнеры с поддержкой сервлетов. Просто посмотрите ссылку, которую я разместил выше.

person Paul Samsotha    schedule 24.04.2015
comment
На самом деле я хочу написать junit-тест для функции, похожей на вашу функцию doSomthing(). - person Syed Aqeel Ashiq; 24.04.2015
comment
Ах, я пропустил эту часть. Вы можете использовать фреймворк Mocking, такой как Mockito, или просто создать заглушку, реализующую только те методы, которые вы используете. Это единственное, что я могу придумать для модульного теста. Для интеграционного теста вы можете использовать Jersey Test Framework, и он запустит приложение и будет полностью функциональным для тестов (включая инъекции). - person Paul Samsotha; 24.04.2015

Вы либо издеваетесь над этим, либо используете что-то вроде http://arquillian.org/

person Friso    schedule 24.04.2015

Я писал интеграционные тесты, поэтому не могу использовать фиктивные вещи.

Я использовал некоторый код для тестов трикотажа

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);
    }
}

Если вы получаете какие-либо ошибки в отношении компонентов области запроса, см. запрос компонентов области действия в весеннем тестировании

person Kalpesh Soni    schedule 11.10.2016