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は、CDC(Consumer Driven Contracts)をサポートするためのプロジェクトでマイクロサービス化されたアプリケーションに嬉しいプロジェクトです。
Consumer Driven Contracts(CDC) testingは主にマイクロサービスに役立つテスト手法です。 Consumer(サービスを使う側)が定義したContract(契約)をProvider(サービスを提供する側)が守らなければなりません。
ソースコードはGitHubに置いてあります。ProducerConsumer
サンプルは、Java13、Spring Boot2.2.0で作っています。
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;
}
}
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>