1. 概要

この記事では、Spring Boot TestRestTemplateについて説明します。 The Guide to RestTemplate のフォローアップとして扱うことができます。これは、TestRestTemplateに焦点を当てる前に読むことを強くお勧めします。 TestRestTemplate は、RestTemplateの魅力的な代替手段と見なすことができます。

2. Mavenの依存関係

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

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

最新バージョンはMavenCentralにあります。

3. TestRestTemplateおよびRestTemplate

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

たとえば、それらは同じメソッド、標準メソッド、ヘッダー、およびその他のHTTP構造を提供します。

また、これらの操作はすべて RestTemplateのガイドで詳しく説明されているため、ここでは再度説明しません。

GETリクエストの簡単な例を次に示します。

TestRestTemplate testRestTemplate = new TestRestTemplate();
ResponseEntity<String> response = testRestTemplate.
  getForEntity(FOO_RESOURCE_URL + "/1", String.class);
 
Assertions.assertEquals(response.getStatusCode(), HttpStatus.OK);

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

4. TestRestTemplateの新機能

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

TestRestTemplate は、基本認証用に指定された資格情報を使用してテンプレートを作成できるコンストラクターを提供します。

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

TestRestTemplate testRestTemplate
 = new TestRestTemplate("user", "passwd");
ResponseEntity<String> response = testRestTemplate.
  getForEntity(URL_SECURED_BY_AUTHENTICATION, String.class);
 
Assertions.assertEquals(response.getStatusCode(), HttpStatus.OK);

4.2. HttpClientOptionを使用したコンストラクター

TestRestTemplate を使用すると、 HttpClientOptionを使用して基盤となるApacheHTTPクライアントをカスタマイズすることもできます。このは、 TestRestTemplate の列挙型であり、次のオプションがあります。 X235X]、およびSSL

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

TestRestTemplate testRestTemplate = new TestRestTemplate("user", 
  "passwd", TestRestTemplate.HttpClientOption.ENABLE_COOKIES);
ResponseEntity<String> response = testRestTemplate.
  getForEntity(URL_SECURED_BY_AUTHENTICATION, String.class);
 
Assertions.assertEquals(response.getStatusCode(), 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);
 
Assertions.assertEquals(response.getStatusCode(), 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);
 
Assertions.assertEquals(response.getStatusCode(), HttpStatus.OK);

6. 結論

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

この記事で提供されている例をGitHubで確認できます。