1. 概要

このチュートリアルでは、REST API からの応答データのキャプチャと検証に焦点を当てて、REST-assuredを使用してRESTサービスをテストする方法について説明します。

2. テストクラスのセットアップ

以前のチュートリアルでは、 REST-一般的に保証されたについて説明し、リクエストヘッダー、Cookie、およびパラメーターを操作する方法を示しました。

この既存のセットアップに基づいて、サービスAppServiceを内部的に呼び出す単純なRESTコントローラーAppControllerを追加しました。 テスト例では、これらのクラスを使用します。

テストクラスを作成するには、もう少しセットアップを行う必要があります。 クラスパスにspring-boot-starter-testがあるため、Springテストユーティリティを簡単に活用できます。

まず、AppControllerIntegrationTestクラスのスケルトンを作成しましょう。

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class AppControllerIntegrationTest {

    @LocalServerPort
    private int port;

    private String uri;

    @PostConstruct
    public void init() {
        uri = "http://localhost:" + port;
    }

    @MockBean
    AppService appService;

     //test cases
}

このJUnitテストでは、ランダムに使用可能なポートでアプリケーションをローカルに起動する、Spring固有のアノテーションをいくつかクラスに付けました。 @PostConstruct では、REST呼び出しを行う完全なURIをキャプチャしました。

このクラスのメソッド呼び出しをモックする必要があるため、AppServiceでも@MockBeanを使用しました。

3. JSON応答の検証

JSONは、RESTAPIでデータを交換するために使用される最も一般的な形式です。 応答は、単一のJSONオブジェクトまたはJSONオブジェクトの配列で構成できます。 このセクションでは両方を見ていきます。

3.1. 単一のJSONオブジェクト

/ movie / {id} エンドポイントをテストする必要があるとします。このエンドポイントは、idが見つかった場合にMovieJSONオブジェクトを返します。

AppService 呼び出しをモックして、Mockitoフレームワークを使用していくつかのモックデータを返します。

@Test
public void givenMovieId_whenMakingGetRequestToMovieEndpoint_thenReturnMovie() {

    Movie testMovie = new Movie(1, "movie1", "summary1");
    when(appService.findMovie(1)).thenReturn(testMovie);

    get(uri + "/movie/" + testMovie.getId()).then()
      .assertThat()
      .statusCode(HttpStatus.OK.value())
      .body("id", equalTo(testMovie.getId()))
      .body("name", equalTo(testMovie.getName()))
      .body("synopsis", notNullValue());
}

上記では、最初に appService.findMovie(1)呼び出しをモックしてオブジェクトを返しました。 次に、RESTによって提供される get()メソッドでREST URLを構築しました。これは、GETリクエストを行うために保証されています。 最後に、4つのアサーションを作成しました。

最初に応答ステータスコードを確認し、次に本体要素を確認しました。 Hamcrest を使用して、期待値をアサートしています。

また、応答JSONがネストされている場合は、“ key1.key2.key3”のようなdot演算子を使用してネストされたキーをテストできることにも注意してください。

3.2. 検証後のJSON応答の抽出

場合によっては、検証後に応答を抽出して、追加の操作を実行する必要があります。

extract()メソッドを使用して、クラスへのJSON応答を抽出できます。

Movie result = get(uri + "/movie/" + testMovie.getId()).then()
  .assertThat()
  .statusCode(HttpStatus.OK.value())
  .extract()
  .as(Movie.class);
assertThat(result).isEqualTo(testMovie);

この例では、 Movie オブジェクトへのJSON応答を抽出し、抽出されたオブジェクトにアサートするようにREST-assuredに指示しました。

extract()。asString() APIを使用して、 String、への応答全体を抽出することもできます。

String responseString = get(uri + "/movie/" + testMovie.getId()).then()
  .assertThat()
  .statusCode(HttpStatus.OK.value())
  .extract()
  .asString();
assertThat(responseString).isNotEmpty();

最後に、応答JSONから特定のフィールドを抽出することもできます

Movie JSON本文を期待し、正常に挿入された場合に同じものを返すPOSTAPIのテストを見てみましょう。

@Test
public void givenMovie_whenMakingPostRequestToMovieEndpoint_thenCorrect() {
    Map<String, String> request = new HashMap<>();
    request.put("id", "11");
    request.put("name", "movie1");
    request.put("synopsis", "summary1");

    int movieId = given().contentType("application/json")
      .body(request)
      .when()
      .post(uri + "/movie")
      .then()
      .assertThat()
      .statusCode(HttpStatus.CREATED.value())
      .extract()
      .path("id");
    assertThat(movieId).isEqualTo(11);
}

上記では、最初にPOSTする必要のあるリクエストオブジェクトを作成しました。 次に、path()メソッドを使用して返されたJSON応答からidフィールドを抽出しました。

3.3. JSON配列

JSON配列の場合は、応答を確認することもできます。

@Test
public void whenCallingMoviesEndpoint_thenReturnAllMovies() {

Set<Movie> movieSet = new HashSet<>();
movieSet.add(new Movie(1, "movie1", "summary1"));
movieSet.add(new Movie(2, "movie2", "summary2"));
when(appService.getAll()).thenReturn(movieSet);

get(uri + "/movies").then()
    .statusCode(HttpStatus.OK.value())
    .assertThat()
    .body("size()", is(2));
}

最初にappService.getAll()をいくつかのデータでモックし、エンドポイントにリクエストを送信しました。 次に、応答配列のstatusCodeとサイズをアサートしました。

これも抽出を介して行うことができます:

Movie[] movies = get(uri + "/movies").then()
  .statusCode(200)
  .extract()
  .as(Movie[].class);
assertThat(movies.length).isEqualTo(2);

4. ヘッダーとCookieの検証

同じ名前のメソッドを使用して、応答のヘッダーまたはCookieを確認できます。

@Test
public void whenCallingWelcomeEndpoint_thenCorrect() {
    get(uri + "/welcome").then()
        .assertThat()
        .header("sessionId", notNullValue())
        .cookie("token", notNullValue());
}

ヘッダーとCookieを個別に抽出することもできます。

Response response = get(uri + "/welcome");

String headerName = response.getHeader("sessionId");
String cookieValue = response.getCookie("token");
assertThat(headerName).isNotBlank();
assertThat(cookieValue).isNotBlank();

5. ファイルの検証

REST APIがファイルを返す場合は、 asByteArray()メソッドを使用して応答を抽出できます。

File file = new ClassPathResource("test.txt").getFile();
long fileSize = file.length();
when(appService.getFile(1)).thenReturn(file);

byte[] result = get(uri + "/download/1").asByteArray();

assertThat(result.length).isEqualTo(fileSize);

ここでは、最初に appService.getFile(1)をモックして、 src / test /resourcesパスに存在するテキストファイルを返します。 次に、エンドポイントを呼び出し、 byte [] で応答を抽出しました。これにより、期待値があると断定されました。

6. 結論

このチュートリアルでは、REST-assuredを使用してRESTAPIからの応答をキャプチャおよび検証するさまざまな方法を検討しました。

いつものように、この記事のコードはGithubから入手できます。