web-dev-qa-db-ja.com

javax.ws.rs.core.UriInfoのインスタンスを取得する方法

テスト用のインスタンスをすばやく作成するために使用できるjavax.ws.rs.core.UriInfoの実装はありますか。このインターフェースは長いので、何かをテストする必要があります。このインターフェースの実装全体に時間を無駄にしたくありません。

PDATE:次のような関数の単体テストを作成したいと思います。

@GET
@Path("/my_path")
@Produces(MediaType.TEXT_XML)
public String webserviceRequest(@Context UriInfo uriInfo);
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>
    

実際のUriInfoが挿入される統合テストを実行する場合は、 Jersey Test Framework を調べる必要があります。

これがJerseyTestFrameworkの完全な例です

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>

小規模なテストに最も効率的なインメモリコンテナを使用します。必要に応じて、サーブレットをサポートする他のコンテナがあります。上に投稿したリンクをご覧ください。

12
Paul Samsotha

モックするか、 http://arquillian.org/

0
Friso

統合テストを書いていたので、モックは使えません

ジャージテストにいくつかのコードを使用しました

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に関するエラーが発生した場合は、 SpringテストでのリクエストスコープBean を参照してください。

0
Kalpesh Soni