4

私は Web サービスに不慣れで、ジャージー クライアント API とジャージー テスト フレームワークの違いは何ですか?

ジャージの REST Web サービス エンドポイントをテストしたいと思います。どれを使うのが正しいですか?

4

1 に答える 1

14

多くの HTTP クライアント API があります ( Apache HttpClientなど)。クライアント側のテストを行うため必要になります。HTTP を介して何らかの方法でサービスにアクセスする必要があるため、単体テストにはこれらの API のいずれかが必要になります。すでに Jersey を使用しているため、Jersey Client APIは適切な選択です。例は次のようになります

final String url = "http://stackoverflow.com/questions/27160440/" +
                                   "jersey-client-api-vs-jersey-test-framework";
Client client = ClientBuilder.newClient();
WebTarget target = client.target(url);
Response response = target.request().accept(MediaType..get();
String html  = response.readEntity(String.class);
System.out.println(html);
response.close();

ご覧のとおり、クライアント API はサービスを呼び出す必要はありません。「Rest」機能を備えた、HTTP呼び出しへの単なるインターフェースです。独自のサービスを実行したい場合は、本格的なサーバー/コンテナーであるか、組み込みのバリアントであるかにかかわらず、最初にそれらをコンテナーにデプロイする必要があります。フレームワークがなければ、完全なテストは次のようになります

<dependencies>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-grizzly2-http</artifactId>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.9</version>
        <scope>test</scope>
    </dependency>
</dependencies>

public class SimpleTest {

    static final String BASE_URI = "http://localhost:8080/myapp/";
    static HttpServer server;
    static Client client;

    private static HttpServer startServer() {
        final ResourceConfig resourceConfig = new ResourceConfig()
                .packages("where.my.resources.are")
                .register(HelloResource.class);
                // normally the resource class would not be in the unit test class
                // and would be in the `where.my.resources.are` package pr sub package
        return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), resourceConfig);
    }

    @Path("hello")
    public static class HelloResource {
        @GET
        public String getHello() {
            return "Hello World!";
        }
    }

    @BeforeClass
    public static void setUpClass() {
        server = startServer();
        client = ClientBuilder.newClient();
    }

    @AfterClass
    public static void tearDownClass() {
        server.shutdown();
    }

     @Test
    public void test() {
        WebTarget target = client.target(BASE_URI);
        Response response = target.path("hello").request().get();
        String hello = response.readEntity(String.class);
        assertEquals("Hello World!", hello);
        response.close();
    }
}

Jersey Test Frameworkを使用すると、より複雑なコンテナー展開のオプションを使用して、半統合/統合テストをより簡単に実行できます。サービスは、単体テストの実行時に自動的に開始および停止する軽量の組み込みコンテナー (さまざまなタイプ) で起動できます。フレームワークは実際には Jersey Client API に依存しているため、フレームワークを使用している場合は、テスト ケースで Client API を使用できます。例

<dependencies>
    <dependency>
        <groupId>org.glassfish.jersey.test-framework.providers</groupId>
        <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
        <version>2.13</version>
    </dependency>
</dependencies>

public class SimpleTest extends JerseyTest {

    @Path("hello")
    public static class HelloResource {
        @GET
        public String getHello() {
            return "Hello World!";
        }
    }

    @Override
    protected Application configure() {
        return new ResourceConfig(HelloResource.class);
    }

    @Test
    public void test() {
        Response response = target("hello").request().get();
        String hello = response.readEntity(String.class);
        assertEquals("Hello World!", hello);
        response.close();
    }
}

類似点を見ることができます@Test。これは、クライアント API を使用しているためです。フレームワークがこれを行うため、を明示的に構成する必要はありませんClient

したがって、選択は、テスト フレームワークを使用するかどうかにかかっています。どちらの方法でも、Jersey Client API の使用方法を知っておく必要があります。どちらの方法でも使用することになります (つまり、HttpClient などの別の HTTP クライアント API を使用する場合を除きます)。


続きを読む

于 2014-11-27T03:26:12.167 に答える