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 サーバーを閉じます。