Spring 以外のアプリケーションの Artifactory でのスタブを使用したプロバイダー契約のテスト
このページでは、Spring 以外のアプリケーションと Artifactory にアップロードされたスタブを使用してプロバイダー契約のテストを行う方法を学習します。
流れ
初めての Spring Cloud 契約ベースのアプリケーションの開発を読んで、Nexus または Artifactory のスタブを使用したプロバイダー契約のテストのフローを確認できます。
コンシューマーのセットアップ
コンシューマー側では、JUnit ルールを使用できます。そうすれば、Spring コンテキストを開始する必要がなくなります。次のリストは、そのようなルール (JUnit4 および JUnit 5) を示しています。
- JUnit 4 ルール
@Rule public StubRunnerRule rule = new StubRunnerRule() .downloadStub("com.example","artifact-id", "0.0.1") .repoRoot("git://[email protected] (英語) :spring-cloud-samples/spring-cloud-contract-nodejs-contracts-git.git") .stubsMode(StubRunnerProperties.StubsMode.REMOTE);
- JUnit 5 拡張機能
@RegisterExtension public StubRunnerExtension stubRunnerExtension = new StubRunnerExtension() .downloadStub("com.example","artifact-id", "0.0.1") .repoRoot("git://[email protected] (英語) :spring-cloud-samples/spring-cloud-contract-nodejs-contracts-git.git") .stubsMode(StubRunnerProperties.StubsMode.REMOTE);
プロデューサーのセットアップ
デフォルトでは、Spring Cloud Contract プラグインは生成されたテストに Rest Assured の MockMvc
セットアップを使用します。Spring 以外のアプリケーションは MockMvc
を使用しないため、testMode
を EXPLICIT
に変更して、特定のポートにバインドされたアプリケーションに実際のリクエストを送信できます。
この例では、ジャバリン (英語) というフレームワークを使用して、非 Spring HTTP サーバーを起動します。
次のアプリケーションがあると仮定します。
import io.javalin.Javalin;
public class DemoApplication {
public static void main(String[] args) {
new DemoApplication().run(7000);
}
public Javalin start(int port) {
return Javalin.create().start(port);
}
public Javalin registerGet(Javalin app) {
return app.get("/", ctx -> ctx.result("Hello World"));
}
public Javalin run(int port) {
return registerGet(start(port));
}
}
このアプリケーションを考慮すると、次のように、EXPLICIT
モードを使用する (つまり、実際のポートにリクエストを送信する) ようにプラグインをセットアップできます。
- Maven
<plugin> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-contract-maven-plugin</artifactId> <version>${spring-cloud-contract.version}</version> <extensions>true</extensions> <configuration> <baseClassForTests>com.example.demo.BaseClass</baseClassForTests> <!-- This will setup the EXPLICIT mode for the tests --> <testMode>EXPLICIT</testMode> </configuration> </plugin>
- Gradle
contracts { // This will setup the EXPLICIT mode for the tests testMode = "EXPLICIT" baseClassForTests = "com.example.demo.BaseClass" }
基本クラスは次のようになります。
import io.javalin.Javalin;
import io.restassured.RestAssured;
import org.junit.After;
import org.junit.Before;
import org.springframework.cloud.test.TestSocketUtils;
public class BaseClass {
Javalin app;
@Before
public void setup() {
// pick a random port
int port = TestSocketUtils.findAvailableTcpPort();
// start the application at a random port
this.app = start(port);
// tell Rest Assured where the started application is
RestAssured.baseURI = "http://localhost:" + port;
}
@After
public void close() {
// stop the server after each test
this.app.stop();
}
private Javalin start(int port) {
// reuse the production logic to start a server
return new DemoApplication().run(port);
}
}
このような設定では:
EXPLICIT
モードを使用してモックされたリクエストではなく実際のリクエストを送信するように Spring Cloud Contract プラグインをセットアップしました。以下の基本クラスを定義しました。
テストごとにランダムなポートで HTTP サーバーを起動します。
そのポートにリクエストを送信するように Rest Assured を設定します。
各テスト後に HTTP サーバーを閉じます。