对于最新的稳定版本,请使用 spring-cloud-contract 4.3.0spring-doc.cadn.net.cn

Spring Cloud 合约 WireMock

Spring Cloud Contract WireMock 模块允许您在 Spring Boot 应用程序。有关更多详细信息,请查看 Spring Cloud Contract 的存储库示例子文件夹spring-doc.cadn.net.cn

如果你有一个使用 Tomcat 作为嵌入式服务器的 Spring Boot 应用程序(即 默认为spring-boot-starter-web),您可以添加spring-cloud-starter-contract-stub-runner到您的类路径并将@AutoConfigureWireMock在测试中使用 Wiremock。Wiremock 作为存根服务器运行,而您 可以使用 Java API 或使用静态 JSON 声明作为 你的测试。spring-doc.cadn.net.cn

要在其他端口上启动存根服务器,请使用(例如)@AutoConfigureWireMock(port=9999).对于随机端口,请使用0.存根 服务器端口可以在测试应用程序上下文中使用wiremock.server.port财产。用@AutoConfigureWireMock添加类型WiremockConfiguration自 测试应用程序上下文,它在方法和类之间缓存 具有相同上下文。Spring 集成测试也是如此。此外,您还可以 注入类型为WireMockServer进入您的测试。 注册的 WireMock 服务器在每个测试类后重置。 但是,如果需要在每个测试方法后重置它,请将wiremock.reset-mappings-after-each-test属性设置为true.spring-doc.cadn.net.cn

自动注册存根

如果您使用@AutoConfigureWireMock,它从文件中注册 WireMock JSON 存根 系统或类路径(默认情况下,从file:src/test/resources/mappings).您可以 使用stubs属性,可以是 Ant 样式的资源模式或目录。对于目录,*/.json是 附加。以下代码显示了一个示例:spring-doc.cadn.net.cn

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureWireMock(stubs="classpath:/stubs")
public class WiremockImportApplicationTests {

	@Autowired
	private Service service;

	@Test
	public void contextLoads() throws Exception {
		assertThat(this.service.go()).isEqualTo("Hello World!");
	}

}
实际上,WireMock 总是从src/test/resources/mappings 如 以及stubs属性。要更改此行为,您可以 此外,请指定文件根目录,如本文档的下一节所述。
此外,在stubslocation 不被视为 Wiremock 的“默认映射”的一部分,调用 自com.github.tomakehurst.wiremock.client.WireMock.resetToDefaultMappings在测试期间不会导致映射 在stubs包括位置。但是,org.springframework.cloud.contract.wiremock.WireMockTestExecutionListener在每个测试类之后重置映射(包括从存根位置添加映射),并且(可选) 在每个测试方法(由wiremock.reset-mappings-after-each-test属性)。

如果您使用 Spring Cloud Contract 的默认存根 jar,则您的 存根存储在/META-INF/group-id/artifact-id/versions/mappings/文件夹。 如果要从该位置注册所有嵌入 JAR 的所有存根,您可以使用 以下语法:spring-doc.cadn.net.cn

@AutoConfigureWireMock(port = 0, stubs = "classpath*:/META-INF...

使用文件指定存根主体

WireMock 可以从类路径或文件系统上的文件中读取响应正文。在 文件系统的情况,您可以在 JSON DSL 中看到响应具有bodyFileName而不是 (字面意思)body.这些文件是相对于根目录解析的(默认情况下,src/test/resources/__files).要自定义此位置,您可以将files属性中的@AutoConfigureWireMock注释到父级的位置 目录(换句话说,__files是一个子目录)。您可以使用 Spring 资源 要引用的符号file:…​classpath:…​地点。通用 URL 不是 支持。可以给出一个值列表——在这种情况下,WireMock 解析第一个文件 当它需要找到响应机构时,它就存在。spring-doc.cadn.net.cn

当您配置filesroot,它还会影响 自动加载存根,因为它们来自根位置 在名为mappings.
的值files没有 对从stubs属性。

替代方法:使用 JUnit 规则

对于更传统的 WireMock 体验,您可以使用 JUnit@Rules启动和停止 服务器。为此,请使用WireMockSpringconvenience 类来获取Options实例,如以下示例所示:spring-doc.cadn.net.cn

@ClassRule表示服务器在此类中的所有方法之后关闭 已经运行了。spring-doc.cadn.net.cn

宽松的 REST 模板 SSL 验证

WireMock 允许您使用httpsURL 协议。如果您的 应用程序想要在集成测试中联系该存根服务器,它会发现 SSL 证书无效(自安装证书的常见问题)。 最好的选择通常是重新配置客户端以使用http.如果那不是 选项,您可以要求 Spring 配置一个忽略 SSL 验证错误的 HTTP 客户端 (当然,仅针对测试)。spring-doc.cadn.net.cn

为了以最小的大惊小怪做到这一点,您需要使用 Spring BootRestTemplateBuilder如以下示例所示:spring-doc.cadn.net.cn

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
	return builder.build();
}

你需要RestTemplateBuilder因为构建器是通过回调传递给 初始化它,以便此时可以在客户端中设置 SSL 验证。这 如果您在测试中使用@AutoConfigureWireMock注释或存根运行器。如果您使用 JUnit@Rule方法,您需要添加@AutoConfigureHttpClient注释,如以下示例所示:spring-doc.cadn.net.cn

@RunWith(SpringRunner.class)
@SpringBootTest("app.baseUrl=https://localhost:6443")
@AutoConfigureHttpClient
public class WiremockHttpsServerApplicationTests {

	@ClassRule
	public static WireMockClassRule wiremock = new WireMockClassRule(
			WireMockSpring.options().httpsPort(6443));
...
}

如果您使用spring-boot-starter-test,则 Apache HTTP 客户端的 类路径,并且它是由RestTemplateBuilder并配置为忽略 SSL 错误。如果使用默认的java.netclient,则不需要注释(但 没有坏处)。目前不支持其他客户端,但可能会添加 在未来的版本中。spring-doc.cadn.net.cn

禁用自定义RestTemplateBuilder,将wiremock.rest-template-ssl-enabled属性设置为false.spring-doc.cadn.net.cn

WireMock 和 Spring MVC 模拟

Spring Cloud Contract 提供了一个方便的类,可以将 JSON WireMock 存根加载到 a SpringMockRestServiceServer.以下项目显示了这一点。spring-doc.cadn.net.cn

baseUrlvalue 被附加到所有模拟调用的前面,并且stubs()方法采用存根 path 资源模式作为参数。在前面的示例中,在/stubs/resource.json加载到模拟服务器中。如果RestTemplate被要求 访问example.org/,它会获取在该 URL 上声明的响应。更多 可以指定一个存根模式,每个存根模式都可以是一个目录(对于递归 全部清单.json)、固定文件名(如前面的示例所示)或 Ant 样式 模式。JSON 格式是普通的 WireMock 格式,您可以在 WireMock 网站上阅读有关该格式的信息。spring-doc.cadn.net.cn

目前,Spring Cloud Contract Verifier 支持 Tomcat、Jetty 和 Undertow 作为 Spring Boot 嵌入式服务器,Wiremock 本身对特定的 Jetty 版本(当前为 9.2)。要使用原生 Jetty,您需要添加原生 Wiremock 依赖项并排除 Spring Boot 容器(如果有)。spring-doc.cadn.net.cn