web-dev-qa-db-ja.com

Jersey REST Webサービスをテストするには?

Restful Webサービスを作成し、JUnit4を使用してテストする必要があります。私はすでにJersey Clientを使用してクライアントを作成しました。しかし、junit4でのみサービスをテストできるかどうかを知りたいです。誰かが少なくともサンプルを手伝ってくれますか?.

残りのサービスには、ユーザー名、パスワードを取得してトークンを返す認証メソッドがあります。

認証方法のテストケースを作成しました。しかし、私はURLを使用してテストする方法がわかりません。

public class TestAuthenticate {
    Service service  = new Service();
    String username = "user";
    String password = "password";
    String token;

    @Test(expected = Exception.class)
    public final void testAuthenticateInputs() {
        password = "pass";
        service.authenticate(username, password);
    }

    @Test(expected = Exception.class)
    public final void testAuthenticateException(){
        username = null;
        String token = service.authenticate(username, password);
        assertNotNull(token);
    }

    @Test
    public final void testAuthenticateResult() {
        String token = service.authenticate(username, password);
        assertNotNull(token);
    }
}
17
Jenny

URLを使用してテストする場合は、テストからサーバーを起動する必要があります。組み込みサーバーを明示的に起動できますが、これはテストではかなり一般的です。何かのようなもの

_public class MyResourceTest {

    public static final String BASE_URI = "http://localhost:8080/api/";
    private HttpServer server;

    @Before
    public void setUp() throws Exception {
        final ResourceConfig rc = new ResourceConfig(Service.class);
        server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);       
    }

    @After
    public void tearDown() throws Exception {
        server.stop();
    }

    @Test
    public void testService() {
        Client client = ClientBuilder.newClient();
        WebTarget target = client.target(BASE_URI).path("service");
        ...
    }
}
_

基本的には統合テストです。 Grizzlyコンテナを起動し、ResourceConfigクラスのみでサーバーにServiceをロードしています。もちろん、構成にさらにクラスを追加することもできます。必要に応じて「実際の」リソース設定を使用できます。

上記のテストはこの依存関係を使用します

_<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-grizzly2-http</artifactId>
    <version>${jersey2.version}</version>
</dependency>
_

私が好むもう1つのオプションは、 Jersey Test Framework を使用することです。これにより、埋め込みコンテナーが開始されます。テストはもっと似ているかもしれません

_public class SimpleTest extends JerseyTest {

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

    @Test
    public void test() {
        String hello = target("service").request().get(String.class);
    }
}
_

この依存関係を使用する

_<dependency>
    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
    <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
    <version>${jersey2.version}</version>
    <scope>test</scope>
</dependency>
_

そして、埋め込まれたGrizzlyコンテナーは、ResourceConfig構成で内部で開始されます。上記の両方の例では、テストURLでわかるように、Serviceクラスの_@Path_値はserviceであると想定されています。

いくつかのリソース

いくつかの例


更新

Mavenを使用していない場合は、Jersey Test Fraemworkの埋め込みGrizzlyコンテナーを実行するために必要なjarがあります

enter image description here

私は通常、すべてのjarファイルを検索します here 。バージョンを選択すると、次のページにダウンロードするリンクがあります。検索バーを使用して、他の人を検索できます。

すべてのjarファイルが揃ったら、簡単な実行例を示します

_import com.Sun.jersey.api.client.WebResource;
import com.Sun.jersey.api.core.DefaultResourceConfig;
import com.Sun.jersey.spi.container.servlet.WebComponent;
import com.Sun.jersey.test.framework.JerseyTest;
import com.Sun.jersey.test.framework.WebAppDescriptor;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import junit.framework.Assert;
import org.junit.Test;

public class SimpleTest extends JerseyTest {

    @Path("service")
    public static class Service {
        @GET
        public String getTest() { return "Hello World!"; }
    }

    public static class AppConfig extends DefaultResourceConfig {
        public AppConfig() {
            super(Service.class);
        }
    }

    @Override
    public WebAppDescriptor configure() {
        return new WebAppDescriptor.Builder()
                .initParam(WebComponent.RESOURCE_CONFIG_CLASS, 
                           AppConfig.class.getName())
                .build();
    }

    @Test
    public void doTest() {
        WebResource resource = resource().path("service");
        String result = resource.get(String.class);
        Assert.assertEquals("Hello World!", result);
        System.out.println(result);
    }
}
_

リソースとResourceConfigをテストと同じクラスに配置することはほとんどないでしょうが、単純にすべてを1つのクラスに表示したいだけです。

Web.xmlまたはResourceConfigサブクラス(上記を参照)のいずれを使用している場合でも、テストクラスに組み込まれている別のResourceConfigを使用して、テスト対象を削減できます。できた。それ以外の場合、通常のResourceConfigクラスを使用している場合は、configureメソッドで置き換えることができます。

configureメソッドは、単にJavaコードでweb.xmlファイルを作成するだけです。 initParamのような_WebAppDescriptor.Builder_でさまざまなメソッドを見ることができます。これはWeb xmlの_<init-param>_と同じです。引数に文字列を単純に使用できますが、上で使用したように、いくつかの定数があります。

_@Test_は、実行される通常のJUnitテストです。 Jerseyクライアントを使用しています。ただし、Clientを作成する代わりに、Clientを返すresource()メソッドにアクセスするだけで、事前に構成されたWebResourceを使用できます。 Jerseyクライアントに精通している場合、このクラスは初めてではありません。

20
Paul Samsotha

@peeskilletは必要な前提条件を与えていると思います。つまり、組み込みWebサーバーでWebサービスを実行する必要があります。また、これを便利に行うためのドロップウィザードまたはスプリングブートのサポートを調べることもできます。

実際に応答を検証するために、私はそれを単純にしてJUnitとhttp-matchersを使います( https://github.com/valid4j/http-matchers を参照)

0
keyoxy

Alchemy rest client generator をご覧ください。これにより、ジャージークライアントを舞台裏で使用して、JAX-RS Webサービスクラスのプロキシ実装を生成できます。事実上、ユニットサービスから単純なJavaメソッドとしてwebserviceメソッドを呼び出します。http認証も処理します。

簡単にテストを実行する必要がある場合、コード生成は関係ないので便利です。

デモはこちら grizzlyをセットアップし、上記のジェネレーターを使用してjunitテストを実行します。

免責事項:私はこのライブラリの著者です。

0
Ashish Shinde