Spring Cloud Contract WireMock

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

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

要在其他端口上启动存根服务器,请使用 (例如)、.对于随机端口,请使用值 。存根 服务器端口可以在测试应用程序上下文中使用属性 .Using 将 测试应用程序上下文,缓存在方法和类之间 具有相同的上下文。Spring 集成测试也是如此。此外,您还可以 将 type 的 bean 注入到测试中。 在每个测试类之后,将重置已注册的 WireMock 服务器。 但是,如果需要在每个测试方法之后重置它,请将该属性设置为 。@AutoConfigureWireMock(port=9999)0wiremock.server.port@AutoConfigureWireMockWiremockConfigurationWireMockServerwiremock.reset-mappings-after-each-testtruespring-doc.cn

自动注册 Stub

如果使用 ,它会从文件中注册 WireMock JSON 存根 system 或 classpath (默认情况下,从 )。您可以 使用注释中的属性自定义位置,该属性可以是 Ant 样式的资源模式或目录。对于目录,是 附加。下面的代码显示了一个示例:@AutoConfigureWireMockfile:src/test/resources/mappingsstubs*/.jsonspring-doc.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 总是从 以及属性中的自定义位置。要更改此行为,您可以 此外,指定 File Root,如本文档的下一节所述。src/test/resources/mappingsstubs
此外,该位置的映射不被视为 Wiremock 的“默认映射”的一部分,并调用 to 不会导致映射 在所包含的位置。但是,它会在每个测试类之后重置映射(包括从 stubs 位置添加映射),并且(可选)会重置 在每个测试方法之后(由属性保护)。stubscom.github.tomakehurst.wiremock.client.WireMock.resetToDefaultMappingsstubsorg.springframework.cloud.contract.wiremock.WireMockTestExecutionListenerwiremock.reset-mappings-after-each-test

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

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

使用文件指定存根主体

WireMock 可以从 Classpath 或文件系统上的文件中读取响应体。在 的情况下,您可以在 JSON DSL 中看到响应具有 a 而不是 (文字) 。文件是相对于根目录解析的(默认情况下为 )。要自定义此位置,可以将 annotation 中的属性设置为父项的位置 directory (换句话说,是一个子目录)。您可以使用 Spring 资源 表示法 (notation) 来引用或位置。通用 URL 不是 支持。可以给出值列表 — 在这种情况下,WireMock 解析第一个文件 当它需要查找响应正文时,它就存在了。bodyFileNamebodysrc/test/resources/__filesfiles@AutoConfigureWireMock__filesfile:…​classpath:…​spring-doc.cn

配置根时,它还会影响 自动加载存根,因为它们来自根位置 在名为 .filesmappings
的值没有 对从属性显式加载的存根的影响。filesstubs

替代方案:使用 JUnit 规则

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

这意味着服务器在完成此类中的所有方法后关闭 已运行。@ClassRulespring-doc.cn

Rest 模板的松散 SSL 验证

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

要使这项工作最小化,您需要在应用程序中使用 Spring Boot,如下例所示:RestTemplateBuilderspring-doc.cn

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

你需要,因为构建器是通过回调传递给 初始化它,以便可以在此时在客户端中设置 SSL 验证。这 如果您使用 Annotation 或 Stub Runner,则会自动在测试中发生。如果使用 JUnit 方法,则还需要添加注释,如下例所示:RestTemplateBuilder@AutoConfigureWireMock@Rule@AutoConfigureHttpClientspring-doc.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));
...
}

如果使用 ,则 Apache HTTP 客户端位于 classpath 的 API 路径,它由 选择并配置为忽略 SSL 错误。如果使用默认客户端,则不需要 Annotation(但它 没有坏处)。目前不支持其他客户端,但可能会添加 在将来的版本中。spring-boot-starter-testRestTemplateBuilderjava.netspring-doc.cn

要禁用自定义 ,请将属性设置为 。RestTemplateBuilderwiremock.rest-template-ssl-enabledfalsespring-doc.cn

WireMock 和 Spring MVC 模拟

Spring Cloud Contract 提供了一个方便的类,可以将 JSON WireMock 存根加载到 一个弹簧 .下面的项目表明了这一点。MockRestServiceServerspring-doc.cn

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

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