Вы просто вводите его с аннотацией @Context
в качестве параметра поля или метода.
@Path("resource")
public class Resource {
@Context
UriInfo uriInfo;
public Response doSomthing(@Context UriInfo uriInfo) {
}
}
Помимо ваших классов ресурсов, его также можно внедрить в других поставщиков, таких как ContainerRequestContext
, ContextResolver
, MessageBodyReader
и т. д.
РЕДАКТИРОВАТЬ
На самом деле я хочу написать junit-тест для функции, похожей на вашу функцию doSomthing().
Я не уловил этого в вашем посте. Но я могу придумать пару вариантов для модульных тестов
Просто создайте заглушку, реализуя только используемые вами методы.
Используйте фреймворк 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