Spring Bootの@RestClientTestへのクイックガイド

Spring Bootの@RestClientTestのクイックガイド

1. 前書き

この記事は、@RestClientTestアノテーションの簡単な紹介です。

新しい注釈は、SpringアプリケーションでのRESTクライアントのテストを簡素化および高速化するのに役立ちます。

2. Spring BootPre-1.4でのRESTクライアントのサポート

Spring Bootは便利なフレームワークであり、多くの自動構成されたSpring Beanに一般的な設定を提供します。これにより、Springアプリケーションの構成に集中することなく、コードとビジネスロジックに集中できます。

ただし、バージョン1.3では、RESTサービスクライアントを作成またはテストする場合、あまり役に立ちません。 RESTクライアントのサポートはそれほど深くありません。

REST APIのクライアントを作成するには、通常、RestTemplateインスタンスが使用されます。 通常、使用する前に構成する必要があり、構成が異なる場合があるため、Spring Bootはユニバーサルに構成されたRestTemplateBeanを提供しません。

RESTクライアントのテストでも同様です。 Spring Boot 1.4.0より前は、Spring RESTクライアントをテストする手順は、他のSpringベースのアプリケーションとほとんど変わりませんでした。 MockRestServiceServerインスタンスを作成し、それをテスト対象のRestTemplateインスタンスにバインドして、次のようにリクエストへのモック応答を提供します。

RestTemplate restTemplate = new RestTemplate();

MockRestServiceServer mockServer =
  MockRestServiceServer.bindTo(restTemplate).build();
mockServer.expect(requestTo("/greeting"))
  .andRespond(withSuccess());

// Test code that uses the above RestTemplate ...

mockServer.verify();

また、コンテキストのロード時間(ひいてはテストの実行時間)を高速化するために、Springコンテナを初期化し、必要なコンポーネントのみがコンテキストにロードされるようにする必要があります。

3. Spring Boot1.4以降の新しいRESTクライアント機能

Spring Boot 1.4では、チームはRESTクライアントの作成とテストを簡素化および高速化するために確固たる努力をしてきました。

それでは、新機能を確認しましょう。

3.1. プロジェクトにSpringBootを追加する

まず、プロジェクトでSpring Boot1.4.x以降が使用されていることを確認する必要があります。


    org.springframework.boot
    spring-boot-starter-parent
     

    
        org.springframework.boot
        spring-boot-starter-web
    
    
        org.springframework.boot
        spring-boot-starter-test
        test
    

最新のリリースバージョンはhereで見つけることができます。

3.2. RestTemplateBuilder

Spring Bootは、自動構成されたRestTemplateBuilderを使用して、RestTemplatesの作成を簡素化し、一致する@RestClientTest注釈を使用して、RestTemplateBuilderで構築されたクライアントをテストします。 RestTemplateBuilderが自動注入された単純なRESTクライアントを作成する方法は次のとおりです。

@Service
public class DetailsServiceClient {

    private final RestTemplate restTemplate;

    public DetailsServiceClient(RestTemplateBuilder restTemplateBuilder) {
        restTemplate = restTemplateBuilder.build();
    }

    public Details getUserDetails(String name) {
        return restTemplate.getForObject("/{name}/details",
          Details.class, name);
    }
}

RestTemplateBuilderインスタンスをコンストラクターに明示的にワイヤリングしていないことに注意してください。 これは、this articleで説明されている暗黙のコンストラクタインジェクションと呼ばれる新しいSpring機能のおかげで可能です。

RestTemplateBuilderは、メッセージコンバーター、エラーハンドラー、URIテンプレートハンドラー、基本認証を登録するための便利なメソッドを提供し、必要な追加のカスタマイザーも使用します。

3.3. @RestClientTest

RestTemplateBuilderで構築されたこのようなRESTクライアントをテストするには、@RestClientTestで注釈が付けられたSpringRunnerで実行されるテストクラスを使用できます。 このアノテーションは完全な自動設定を無効にし、RESTクライアントテストに関連する設定のみを適用します。 JacksonまたはGSONの自動構成と@JsonComponent Beanですが、通常の@ComponentBeanではありません。

@RestClientTestは、JacksonおよびGSONのサポートが自動構成されていることを確認し、事前構成されたRestTemplateBuilderおよびMockRestServiceServerインスタンスをコンテキストに追加します。 テスト対象のBeanは、@RestClientTestアノテーションのvalueまたはcomponents属性で指定されます。

@RunWith(SpringRunner.class)
@RestClientTest(DetailsServiceClient.class)
public class DetailsServiceClientTest {

    @Autowired
    private DetailsServiceClient client;

    @Autowired
    private MockRestServiceServer server;

    @Autowired
    private ObjectMapper objectMapper;

    @Before
    public void setUp() throws Exception {
        String detailsString =
          objectMapper.writeValueAsString(new Details("John Smith", "john"));

        this.server.expect(requestTo("/john/details"))
          .andRespond(withSuccess(detailsString, MediaType.APPLICATION_JSON));
    }

    @Test
    public void whenCallingGetUserDetails_thenClientMakesCorrectCall()
      throws Exception {

        Details details = this.client.getUserDetails("john");

        assertThat(details.getLogin()).isEqualTo("john");
        assertThat(details.getName()).isEqualTo("John Smith");
    }
}

まず、@RunWith(SpringRunner.class)アノテーションを追加して、このテストがSpringRunnerで実行されることを確認する必要があります。

では、何が新しいのでしょうか。

First@RestClientTestアノテーションにより、テスト対象の正確なサービスを指定できます–この場合、それはDetailsServiceClientクラスです。 このサービスはテストコンテキストに読み込まれますが、他のすべては除外されます。

これにより、テスト内でDetailsServiceClientインスタンスを自動配線し、他のすべてを外部に残すことができます。これにより、コンテキストの読み込みが高速化されます。

SecondMockRestServiceServerインスタンスも@RestClientTestアノテーション付きテスト用に構成されているため(そしてDetailsServiceClientインスタンスにバインドされているため)、単純に挿入して使用できます。

Finally@RestClientTestのJSONサポートにより、JacksonのObjectMapperインスタンスを挿入して、MockRestServiceServer’sモック回答値を準備できます。

あとは、サービスへの呼び出しを実行して結果を確認するだけです。

4. 結論

この記事では、Springで構築されたRESTクライアントの簡単で迅速なテストを可能にする新しい@RestClientTestアノテーションについて説明しました。

記事のソースコードはon GitHubで入手できます。