2019年11月19日

Spring Cloud Contractを触ってみようと思ったきっかけは、会社での SwaggerでAPI仕様書を書く -> レビュー -> 実装 という開発フロー問題を感じているからです。 このフローには 1.実装とAPI仕様書で乖離してしまう恐れがある2.いちいちAPI仕様書を書くのがめんどくさい3.実装が仕様を満たしている保証はできない という問題があります。

そこで、実装とAPI仕様書が乖離しないいい感じのライブラリを探してたら、「Spring Fox」と「Spring REST Docs」が見つかりました。しかし、どちらもコードからAPI仕様書を生成してくれるライブラリなのですが、微妙だなと感じました。 Spring Foxは、公式でないしプロダクトコードに手を加えないといけないです。Spring REST Docsは理想に近かったのですが、TDD向きで今から始めるには辛いかなと。 このような相談を知り合いのエンジニアに話したら、「Spring Cloud Contract」があるよと教えてくれました。

Spring Cloud Contractとは

Spring Cloud Contractは、CDC(Consumer Driven Contracts)をサポートするためのプロジェクトでマイクロサービス化されたアプリケーションに嬉しいプロジェクトです。

Consumer Driven Contracts testingとは

Consumer Driven Contracts(CDC) testingは主にマイクロサービスに役立つテスト手法です。 Consumer(サービスを使う側)が定義したContract(契約)をProvider(サービスを提供する側)が守らなければなりません。

サンプルアプリケーション

ソースコードはGitHubに置いてあります。ProducerConsumer

サンプルの内容

サンプルは、Java13、Spring Boot2.2.0で作っています。

Producer

Controllerの実装

BrandController.java

@RestController
@RequestMapping("/brands")
public class BrandController {
  @GetMapping
  public BrandListDto list() {
      Brand stof = new Brand();
      stof.setName("STOF");
      stof.setDesigner("Tanita");

      BrandListDto listDto = new BrandListDto();
      listDto.setBrands(List.of(stof));
      return listDto;
  }
}

Spring Cloud Contractを依存関係に追加

pom.xml

<dependencies>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-contract-verifier</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>

<dependencyManagement>
  <dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<build>
  <plugins>
    <plugin>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-contract-maven-plugin</artifactId>
        <version>${spring-cloud-contract-maven-plugin.verison}</version>
        <extensions>true</extensions>
        <configuration>
        <!-- 生成するテストがextendsするクラス -->
            <baseClassForTests>
                com.b1a9idps.springcloudcontractsample.producer.TestBase
            </baseClassForTests>
        <!-- JUnit5で利用できるように(デフォルトはJUnit4) -->
            <testFramework>JUNIT5</testFramework>
        </configuration>
    </plugin>
  </plugins>
</build>
Powered by Fruition