Spring BootのTestRestTemplateを調べる

1概要

この記事ではSpring Bootの TestRestTemplate について説明します。リンクのフォローアップとして扱うことができます:/rest-template[RestTemplateガイド]、 TestRestTemplate に焦点を当てる前に読むことを強くお勧めします。 TestRestTemplate は、 RestTemplate の魅力的な代替手段と見なすことができます。

2 Mavenの依存関係

TestRestTemplate を使用するには、次のような適切な依存関係が必要です。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-test</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>

最新版はhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.springframework.boot%22%20AND%20a%3A%22spring-boot-test%にあります。 22[メイヴン中央]。

3 TestRestTemplate および RestTemplate

どちらのクライアントも統合テストの作成に非常に適しており、HTTP APIとの通信を非常にうまく処理できます。

たとえば、標準のメソッド、ヘッダー、その他のHTTPコンストラクトと同じメソッドを提供しています。

そしてこれらすべての操作は RestTemplateへのガイド で詳しく説明されているので、ここでそれらを再検討することはしません。

これが簡単なGETリクエストの例です。

TestRestTemplate testRestTemplate = new TestRestTemplate();
ResponseEntity<String> response = testRestTemplate.
  getForEntity(FOO__RESOURCE__URL + "/1", String.class);

assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));

両方のクラスが非常に似ているという事実にもかかわらず、 TestRestTemplate RestTemplate を拡張せず、いくつかの非常にエキサイティングな新機能を提供します。

** 4 TestRestTemplate の新機能

4.1. 基本認証資格情報を持つコンストラクタ

TestRestTemplate は、基本認証用の指定された資格を持つテンプレートを作成するためのコンストラクタを提供します。

このインスタンスを使用して実行されたすべての要求は、提供された資格情報を使用して認証されます。

TestRestTemplate testRestTemplate
 = new TestRestTemplate("user", "passwd");
ResponseEntity<String> response = testRestTemplate.
  getForEntity(URL__SECURED__BY__AUTHENTICATION, String.class);

assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));

4.2. HttpClientOption を持つコンストラクタ

TestRestTemplate を使用すると、 HttpClientOptionを使用して基礎となるApache HTTPクライアントをカスタマイズすることもできます。これは TestRestTemplate の列挙型で、 ENABLE COOKIES、ENABLE REDIRECTS 、および SSL__です。

簡単な例を見てみましょう。

TestRestTemplate testRestTemplate = new TestRestTemplate("user",
  "passwd", TestRestTemplate.HttpClientOption.ENABLE__COOKIES);
ResponseEntity<String> response = testRestTemplate.
  getForEntity(URL__SECURED__BY__AUTHENTICATION, String.class);

assertThat(response.getStatusCode(), equalTo(HttpStatus.OK))

上記の例では、基本認証と共にオプションを使用しています。

認証が必要ない場合でも、単純なコンストラクタを使用してテンプレートを作成できます。

TestRestTemplate(TestRestTemplate.HttpClientOption.ENABLE COOKIES)__

4.3. 新しい方法

コンストラクタが指定された資格を使ってテンプレートを作成できるだけではありません。

テンプレートの作成後に認証情報を追加することもできます。

TestRestTemplate は、既存のテンプレートに認証情報を追加するメソッド withBasicAuth() を提供します。

TestRestTemplate testRestTemplate = new TestRestTemplate();
ResponseEntity<String> response = testRestTemplate.withBasicAuth(
  "user", "passwd").getForEntity(URL__SECURED__BY__AUTHENTICATION,
  String.class);

assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));

5 TestRestTemplate RestTemplate の両方を使用する

TestRestTemplate は、 RestTemplate のラッパーとして機能します。レガシーコードを扱っているためにそれを使用することを余儀なくされた場合。このような単純なラッパーを作成する方法は以下のとおりです。

RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder();
restTemplateBuilder.configure(restTemplate);
TestRestTemplate testRestTemplate = new TestRestTemplate(restTemplateBuilder);
ResponseEntity<String> response = testRestTemplate.getForEntity(
  FOO__RESOURCE__URL + "/1", String.class);

assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));

6. 結論

TestRestTemplate RestTemplate の拡張ではなく、統合テストを単純化し、テスト中の認証を容易にする代替手段です。これはApache HTTPクライアントのカスタマイズに役立ちますが、 RestTemplate のラッパーとしても使用できます。

over on GitHub で提供されている例を確認できます。