コンテキストパスの操作

Spring Cloud Contract はコンテキストパスをサポートします。

コンテキストパスを完全にサポートするために必要な唯一の変更は、プロデューサー側のスイッチです。また、自動生成されたテストでは明示的モードを使用する必要があります。コンシューマー側は手つかずのままです。生成されたテストが合格するには、明示的モードを使用する必要があります。次の例は、テストモードを 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>
        <testMode>EXPLICIT</testMode>
    </configuration>
</plugin>
Gradle
contracts {
		testMode = 'EXPLICIT'
}

このようにして、MockMvc を使用しないテストを生成します。これは、実際のリクエストを生成し、生成されたテストの基本クラスを実際のソケットで動作するように設定する必要があることを意味します。

次の契約について考えてみましょう。

org.springframework.cloud.contract.spec.Contract.make {
	request {
		method 'GET'
		url '/my-context-path/url'
	}
	response {
		status OK()
	}
}

次の例は、基本クラスと RestAssured を設定する方法を示しています。

import io.restassured.RestAssured;
import org.junit.Before;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.server.LocalServerPort;

@SpringBootTest(classes = ContextPathTestingBaseClass.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class ContextPathTestingBaseClass {
	
	@LocalServerPort int port;
	
	@Before
	public void setup() {
		RestAssured.baseURI = "http://localhost";
		RestAssured.port = this.port;
	}
}

このようにすると:

  • 自動生成されたテスト内のすべてのリクエストは、コンテキストパス ( /my-context-path/url など) を含めて実際のエンドポイントに送信されます。

  • 契約にはコンテキストパスがあることが反映されています。生成されたスタブにもその情報が含まれています (たとえば、スタブでは /my-context-path/url を呼び出す必要があります)。