Newer
Older
notes / REST / restito.md

Restito - testing framework for rest clients

Restitoとは

Restitoは、モックライブラリであるmockitoにインスパイアされた、RESTサーバ実装の試験ライブラリであるREST-assuredとは機能的にはちょうど正反対となる、RESTクライアント実装の試験ライブラリです。通常、Junitと合わせて使用します。

Restitoが提供するDSLで、

  • RESTサーバの振る舞いのモック化
  • RESTサーバへのHTTP呼び出しを記録
  • HTTP呼び出しの検証

を行うことができ、別途RESTサーバを用意することなく、RESTクライアントの結合/自動試験を行うことができます。

Resatitoは、テスト毎にスタブサーバのインスタンスを起動し、テストするクライアントからのリクエストに対して、事前に用意したレスポンスを返します。その際に、呼ばれたURL、GET/POSTメソッド、ヘッダの値などの妥当性を検証することができます。

ライブラリ

次のライブラリが必要です。

<dependency>
    <groupId>com.xebialabs.restito</groupId>
    <artifactId>restito</artifactId>
    <version>0.7</version>
</dependency>

基本的な使い方

次のRESTクライントを例に、基本的な使い方を説明します。

public class PluginClient {

    private final Client client;

    private final WebTarget webTarget;

    /**
     * コンストラクタ。
     */
    public PluginClient(String baseurl) {
        if (baseurl == null) {
            throw new IllegalArgumentException("baseUrl should be not null.");
        }
        this.client = ClientBuilder.newClient();
        this.webTarget = client.target(baseurl);
    }

    /**
     * 指定したIDのプラグインの情報をJSONで取得します。
     */
    public Plugin getPlugin(int id) {
        return webTarget.path("/{id}").resolveTemplate("id", id)
                .request(MediaType.APPLICATION_JSON)
                .get(Plugin.class);
    }
}

getPlugin() メソッドのテストは次のようになります。

Restitoの事前処理、事後処理

テストメソッドごとにRESTサーバの起動を行います。

public class PluginClientTest {

    // RESTサーバ
    private StubServer server;
    // テスト対象
    private PluginClient target;

    /**
     * 事前処理
     */
    @Before
    public void setUp() throws Exception {
        // RESTサーバを起動
        this.server = new StubServer().run();
        // テスト対象のインスタンスを生成
        // RESTサーバのポート番号を取得し、URLを組み立てる
        this.target = new PluginClient("http://localhost:" + server.getPort() + "/api/p");
    }

    /**
     * 事後処理
     */
    @After
    public void tearDown() throws Exception {
        // RESTサーバを終了
        server.stop();
    }

RESTサーバのポート番号はランダムなため、RESTサーバ起動後ポート番号を取得し、テスト対象に設定します。ポート番号を固定にしたい場合は、

    // RESTサーバを起動(ポート番号固定)
    this.server = new StubServer(8080).run();

のように指定します。

テストメソッドの実装

テストメソッドでは、

  1. RESTサーバのモックを設定
  2. テスト対象実行
  3. リクエストの検証
  4. 戻り値などの検証

を行います。

  /**
   * 指定したプラグイン情報取得のテスト。
   */
    @Test
    public void testGetPlugin() throws Exception {
        // レスポンスとして返却するJSONを生成
        Plugin plugin = new Plugin(1, "Mantis Plugin", "Integrates with Mantis");
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(plugin);
        
        // "/api/p/1"が呼ばれた時の動作のモック化
        whenHttp(server)
            // "/api/p/1"が呼ばれたたら
            .match(uri("/api/p/1"))
        .then(
            // レスポンスのステータスコードは200(OK)を返す
            status(HttpStatus.OK_200),
          // さらに、コンテンツとしてJSONを返す
            stringContent(json),
            // ヘッダも指定
            contentType("application/json")
        );

        // テスト対象のメソッドを実行
        Plugin answer = target.getPlugin(1);

        // リクエストの検証
        verifyHttp(server).once(
            // GETメソッドであること
            method(Method.GET),
            // URLが正しいこと
            uri("/api/p/1"),
            // ヘッダ"accept"が正しいこと
            withHeader("accept", "application/json")
        );
        
        // 戻り値の検証
        assertThat(answer, notNullValue());
        assertThat(answer.getId(), is(1));
        assertThat(answer.getName(), is("Mantis Plugin"));
        assertThat(answer.getDescription(), is("Integrates with Mantis"));
    }