Spring Cloud Contract WireMock
Spring Cloud Contract WireMock 模块允许您在 Spring Boot 应用程序。有关更多详细信息,请查看 Spring Cloud Contract 的 repository samples 子文件夹。
如果您有一个使用 Tomcat 作为嵌入式服务器的 Spring Boot 应用程序(即
默认值为 ),你可以添加到 Classpath 中,并添加以在测试中使用 Wiremock。Wiremock 作为存根服务器运行,而您
可以通过使用 Java API 或使用静态 JSON 声明作为
你的测试。spring-boot-starter-web
spring-cloud-starter-contract-stub-runner
@AutoConfigureWireMock
要在其他端口上启动存根服务器,请使用 (例如)、.对于随机端口,请使用值 。存根
服务器端口可以在测试应用程序上下文中使用属性 .Using 将
测试应用程序上下文,缓存在方法和类之间
具有相同的上下文。Spring 集成测试也是如此。此外,您还可以
将 type 的 bean 注入到测试中。
在每个测试类之后,将重置已注册的 WireMock 服务器。
但是,如果需要在每个测试方法之后重置它,请将该属性设置为 。@AutoConfigureWireMock(port=9999)
0
wiremock.server.port
@AutoConfigureWireMock
WiremockConfiguration
WireMockServer
wiremock.reset-mappings-after-each-test
true
自动注册 Stub
如果使用 ,它会从文件中注册 WireMock JSON 存根
system 或 classpath (默认情况下,从 )。您可以
使用注释中的属性自定义位置,该属性可以是
Ant 样式的资源模式或目录。对于目录,是
附加。下面的代码显示了一个示例:@AutoConfigureWireMock
file:src/test/resources/mappings
stubs
*/.json
@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/mappings stubs |
此外,该位置的映射不被视为 Wiremock 的“默认映射”的一部分,并调用
to 不会导致映射
在所包含的位置。但是,它会在每个测试类之后重置映射(包括从 stubs 位置添加映射),并且(可选)会重置
在每个测试方法之后(由属性保护)。stubs com.github.tomakehurst.wiremock.client.WireMock.resetToDefaultMappings stubs org.springframework.cloud.contract.wiremock.WireMockTestExecutionListener wiremock.reset-mappings-after-each-test |
如果您使用 Spring Cloud Contract 的默认存根 jar,则您的
存根存储在文件夹中。
如果要从该位置注册所有嵌入式 JAR 中的所有存根,可以使用
以下语法:/META-INF/group-id/artifact-id/versions/mappings/
@AutoConfigureWireMock(port = 0, stubs = "classpath*:/META-INF...
使用文件指定存根主体
WireMock 可以从 Classpath 或文件系统上的文件中读取响应体。在
的情况下,您可以在 JSON DSL 中看到响应具有 a 而不是
(文字) 。文件是相对于根目录解析的(默认情况下为 )。要自定义此位置,可以将 annotation 中的属性设置为父项的位置
directory (换句话说,是一个子目录)。您可以使用 Spring 资源
表示法 (notation) 来引用或位置。通用 URL 不是
支持。可以给出值列表 — 在这种情况下,WireMock 解析第一个文件
当它需要查找响应正文时,它就存在了。bodyFileName
body
src/test/resources/__files
files
@AutoConfigureWireMock
__files
file:…
classpath:…
配置根时,它还会影响
自动加载存根,因为它们来自根位置
在名为 .files mappings |
的值没有
对从属性显式加载的存根的影响。files stubs |
替代方案:使用 JUnit 规则
对于更传统的 WireMock 体验,您可以使用 JUnit 来启动和停止
服务器。为此,请使用 convenience 类获取实例,如下例所示:@Rules
WireMockSpring
Options
这意味着服务器在完成此类中的所有方法后关闭
已运行。@ClassRule
Rest 模板的松散 SSL 验证
WireMock 允许您使用 URL 协议对 “安全” 服务器进行存根。如果您的
应用程序想要在集成测试中联系该存根服务器,它发现
SSL 证书无效(自行安装的证书的常见问题)。
最好的选择通常是重新配置客户端以使用 .如果那不是
选项,你可以要求 Spring 配置一个忽略 SSL 验证错误的 HTTP 客户端
(当然,仅对测试执行此操作)。https
http
要使这项工作最小化,您需要在应用程序中使用 Spring Boot,如下例所示:RestTemplateBuilder
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
你需要,因为构建器是通过回调传递给
初始化它,以便可以在此时在客户端中设置 SSL 验证。这
如果您使用 Annotation 或 Stub Runner,则会自动在测试中发生。如果使用 JUnit 方法,则还需要添加注释,如下例所示:RestTemplateBuilder
@AutoConfigureWireMock
@Rule
@AutoConfigureHttpClient
@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-test
RestTemplateBuilder
java.net
要禁用自定义 ,请将属性设置为 。RestTemplateBuilder
wiremock.rest-template-ssl-enabled
false
WireMock 和 Spring MVC 模拟
Spring Cloud Contract 提供了一个方便的类,可以将 JSON WireMock 存根加载到
一个弹簧 .下面的项目表明了这一点。MockRestServiceServer
该值附加到所有 mock 调用的前面,并且该方法采用存根
path 资源模式作为参数。在前面的示例中,定义的存根 at 被加载到模拟服务器中。如果要求
访问 ,它会获取在该 URL 中声明的响应。更多
可以指定一个存根模式,并且每个存根模式可以是一个目录(对于递归的
list of all )、固定文件名(如前面的示例所示)或 Ant 样式
模式。JSON 格式是普通的 WireMock 格式,您可以在 WireMock 网站上阅读有关该格式的信息。baseUrl
stubs()
/stubs/resource.json
RestTemplate
example.org/
.json
目前,Spring Cloud Contract Verifier 支持 Tomcat、Jetty 和 Undertow 作为 Spring Boot 嵌入式服务器,而 Wiremock 本身对特定的 Jetty 版本(当前为 9.2)。要使用本机 Jetty,您需要将本机 Wiremock 依赖项并排除 Spring Boot 容器(如果有)。