SpringBoot は RESTful API 統合テストに TestRestTemplate を使用します
RESTful API 統合テストは、アプリケーションとその外部依存関係間の統合をテストします。SpringBoot では RESTful API をテストするための TestRestTemplate が提供されていますので、この記事では RESTful API の統合テストに TestRestTemplate を使用する方法を紹介します。
1.TestRestTemplateとは
TestRestTemplate は、SpringBoot が提供する RESTful API をテストするためのツールクラスです。TestRestTemplate は、テストで HTTP 要求をシミュレートし、応答が期待どおりであることを検証できます。TestRestTemplate は RestTemplate に基づいて実装されていますが、テストで使用するために異なる構成とインターセプターを使用します。
2.TestRestTemplateの使い方
TestRestTemplate の使用は非常に簡単で、テスト クラスで TestRestTemplate インスタンスを作成し、このインスタンスを使用して HTTP リクエストを実行するだけです。たとえば、TestRestTemplate を使用して RESTful API をテストする例を次に示します。
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UserControllerIntegrationTest {
@Autowired
private TestRestTemplate restTemplate;
@Test
public void shouldReturnUserById() {
ResponseEntity<User> responseEntity = restTemplate.getForEntity("/users/{id}", User.class, 1);
User user = responseEntity.getBody();
assertThat(user.getId()).isEqualTo(1L);
assertThat(user.getName()).isEqualTo("John Smith");
}
}
テストでは、Spring Boot Test と JUnit アノテーションを使用してテスト環境を構成します。@Autowired アノテーションは、TestRestTemplate インスタンスを自動的に挿入するために使用されます。テスト メソッドでは、TestRestTemplate を使用して HTTP GET リクエストを実行し、アサーションを使用して応答が期待どおりであることを確認します。
3. TestRestTemplate の高度な使用法
TestRestTemplate は、HTTP リクエストをシミュレートし、テストでの応答を検証するための高度な使用法を多数提供します。一般的な高度な使用法をいくつか示します。
3.1 HTTPリクエストのシミュレーション
TestRestTemplate は、GET、POST、PUT、DELETE などのさまざまな HTTP リクエストをシミュレートできます。ここではいくつかの例を示します。
// GET 请求
ResponseEntity<User> responseEntity = restTemplate.getForEntity("/users/{id}", User.class, 1);
// POST 请求
User user = new User("John Smith");
ResponseEntity<User> responseEntity = restTemplate.postForEntity("/users", user, User.class);
// PUT 请求
User user = new User("John Smith");
restTemplate.put("/users/{id}", user, 1);
// DELETE 请求
restTemplate.delete("/users/{id}", 1);
3.2 HTTP レスポンスの検証
TestRestTemplate は、ステータス コード、応答ヘッダー、応答本文など、HTTP 応答のさまざまな属性を検証できます。ここではいくつかの例を示します。
// 验证状态码
ResponseEntity<User> responseEntity = restTemplate.getForEntity("/users/{id}", User.class, 1);
assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK);
// 验证响应头
ResponseEntity<User> responseEntity = restTemplate.getForEntity("/users/{id}", User.class, 1);
assertThat(responseEntity.getHeaders().getContentType()).isEqualTo(MediaType.APPLICATION_JSON);
// 验证响应体
ResponseEntity<User> responseEntity = restTemplate.getForEntity("/users/{id}", User.class, 1);
User user = responseEntity.getBody();
assertThat(user.getId()).isEqualTo(1L);
assertThat(user.getName()).isEqualTo("John Smith");
3.3 リクエストヘッダーの追加
TestRestTemplate は、HTTP リクエスト ヘッダーを追加して、実際の HTTP リクエストをシミュレートできます。ここではいくつかの例を示します。
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer token");
HttpEntity<Object> entity = new HttpEntity<>(headers);
ResponseEntity<User> responseEntity = restTemplate.exchange("/users/{id}", HttpMethod.GET, entity, User.class, 1);
User user = responseEntity.getBody();
assertThat(user.getId()).isEqualTo(1L);
assertThat(user.getName()).isEqualTo("John Smith");
3.4 パラメータ化された URL の使用
TestRestTemplate は、パラメーター化された URL を使用して、テストで URL を動的に生成できます。ここではいくつかの例を示します。
// 使用占位符
ResponseEntity<User> responseEntity = restTemplate.getForEntity("/users/{id}", User.class, 1);
// 使用Map
Map<String, Long> params = new HashMap<>();
params.put("id", 1L);
ResponseEntity<User> responseEntity = restTemplate.getForEntity("/users/{id}", User.class, params);
// 使用URI
URI uri = UriComponentsBuilder.fromUriString("/users/{id}").build(1);
ResponseEntity<User> responseEntity = restTemplate.getForEntity(uri, User.class);
3.5 インターセプターの使用
TestRestTemplate はインターセプターを使用して、HTTP リクエストとレスポンスの間にカスタム ロジックを追加できます。ここではいくつかの例を示します。
// 添加请求拦截器
restTemplate.getRestTemplate().setInterceptors(Collections.singletonList((request, body, execution) -> {
request.getHeaders().set("Authorization", "Bearer token");
return execution.execute(request, body);
}));
// 添加响应拦截器
restTemplate.getRestTemplate().setInterceptors(Collections.singletonList((request, body, execution) -> {
ResponseEntity<User> responseEntity = execution.execute(request, body, User.class);
User user = responseEntity.getBody();
user.setName(user.getName().toUpperCase());
return new ResponseEntity<>(user, responseEntity.getStatusCode());
}));
上記の例では、リクエスト インターセプターとレスポンス インターセプターが使用されています。リクエスト インターセプターは Authorization リクエスト ヘッダーを追加し、レスポンス インターセプターはレスポンス本文の名前フィールドを大文字に変換します。
4. まとめ
TestRestTemplate は、SpringBoot が提供する RESTful API をテストするためのツールクラスです。TestRestTemplate を使用して HTTP 要求をシミュレートし、応答が期待どおりであることを確認します。TestRestTemplate は、さまざまな HTTP 要求のモック化、HTTP 応答の検証、要求ヘッダーの追加、パラメーター化された URL の使用、インターセプターの使用など、多くの高度な使用法を提供します。TestRestTemplate を使用してアプリケーションの RESTful API を効率的にテストし、外部依存関係との統合が適切に機能していることを確認します。