This is a cache of http://qiita.com/ysks-y/items/1ea7c88d16b93c893c0c. It is a snapshot of the page at 2017-08-27T02:53:18.907+0900.
junitでWebApiを<strong>テスト</strong> - Qiita

junitでWebApiをテスト

  • 1
    いいね
  • 0
    コメント

jUnitとrest-assuredを使ってWebApiをテストする

JSON形式のフォーマットを使うAPIのテストをする必要になったので以下にまとめます。
検証しながらなので間違いもあるかと思います。

必要なもの

  • rest-assured
  • junit
  • dbunit(DBのレコードもテストするなら)

リクエストのの設定

rest-assuredが自動的にリクエストに用いるObjectクラスをJsonに変換してくれます。
今回はJackson2を使っています。

  • 以下の順でclasspathの存在を確認してシリアライズが行われます。
  1. Jackson2
  2. Jackson
  3. Gson

ObjectMapperを使うので、その設定と接続先を指定します。

// api接続先ホスト名
RestAssured.baseURI = "http://localhost"
// ObjectMapperの設定
RestAssured.config = RestAssuredConfig.config().objectMapperConfig(
        ObjectMapperConfig.objectMapperConfig().jackson2ObjectMapperFactory(new Jackson2ObjectMapperFactory() {
            @SuppressWarnings("rawtypes")
            @Override
            public ObjectMapper create(Class cls, String charset) {
                ObjectMapper objectMapper = new ObjectMapper();
                // ObjectMapperの設定をここに

                return objectMapper;
            }
        })
);

リクエスト送信

// staticインポート
import static io.restassured.RestAssured.given;

ResponseClass response = given()
    .contentType(ContentType.JSON)  // content type
    .body(reqest)                   // リクエスト
.when()
    .post("/api/hoge/1")                 // APIのエンドポイントを指定
.then()
    .statusCode(200)
    .extract().as(ResponseClass.class);   // 指定したクラスにデシリアライズ

レスポンスのアサート

junitのアサートを使って想定通りの値が返って来てるか確認します。

Assert.assertThat(response.hoge, is("hoge"));

DbUnitとエクセルを使ってレコード一致確認

DbUnitを使えば現在のDBのレコードとエクセルに書き出したデータを期待値として比較することができます。
また、エクセルファイルにDBのレコードを書き出すことも出来るので便利です。

Connection connection = DriverManager.getConnection(url, username, password)
IDatabaseConnection iDbConnection = new IDatabaseConnection(connection);

// 実行後のデータ
IDataSet dataSet = dbConn.createDataSet();

// 指定したテーブル名のレコードを取得
ITable data= dataSet.getTable("table");

// アサートから除外したいカラムを設定
data = DefaultColumnFilter.excludedColumnsTable(iTable, "created_at");

// カラムを指定してソート
data= new SortedTable(iTable, "hoge_name");


// 期待値データ(エクセル)
ITable 期待値 = new XlsDataSet(new File("hoge/huga/期待値.xls"));
期待値 = DefaultColumnFilter.excludedColumnsTable(iTable, "created_at");
期待値 = new SortedTable(iTable, "hoge_name");

// junitのassertEqualsではなく、DbUnitのAssertion#assertEqualsを使うように気を付けること
Assertion.assertEquals(期待値, data);

型の異なる値をリクエストパラメータに含めたい

  • ObjectMapperを使ってリクエストObjectをMapに変換することで解決します。
RequestObj request = new RequestObj():
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = objectMapper.writeValueAsString(request);
LinkedHashMap<String, Object> map = objectMapper.readValue(jsonString, new TypeReference<LinkedHashMap<String, Object>>(){});