Spring Cloud Contract WireMock
模块让您有可能使用 WireMock使用嵌入在Spring Boot应用的“环境”服务器不同的服务器。查看 样品 了解更多详情。
重要 | Spring Cloud发布列表BOM导入spring-cloud-contract-dependencies ,这反过来又排除了WireMock所需的依赖关系。这可能导致一种情况,即使你不使用Spring Cloud Contract,那么你的依赖将会受到影响。 |
如果您有一个使用Tomcat作为嵌入式服务器的Spring Boot应用程序(默认为spring-boot-starter-web
)),那么您可以简单地将spring-cloud-contract-wiremock
添加到类路径中并添加@AutoConfigureWireMock
,以便可以在测试中使用Wiremock。Wiremock作为存根服务器运行,您可以使用Java API或通过静态JSON声明来注册存根行为,作为测试的一部分。这是一个简单的例子:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureWireMock(port = 0)
public class WiremockForDocsTests {
// A service that calls out over HTTP
@Autowired private Service service;
// Using the WireMock APIs in the normal way:
@Test
public void contextLoads() throws Exception {
// Stubbing WireMock
stubFor(get(urlEqualTo("/resource"))
.willReturn(aResponse().withHeader("Content-Type", "text/plain").withBody("Hello World!")));
// We're asserting if WireMock responded properly
assertThat(this.service.go()).isEqualTo("Hello World!");
}
}
要使用@AutoConfigureWireMock(port=9999)
(例如)启动不同端口上的存根服务器,并且对于随机端口使用值0.存根服务器端口将在测试应用程序上下文中绑定为“wiremock.server.port”。使用@AutoConfigureWireMock
将一个类型为WiremockConfiguration
的bean添加到测试应用程序上下文中,它将被缓存在具有相同上下文的方法和类之间,就像一般的Spring集成测试一样。
自动注册存根
如果您使用@AutoConfigureWireMock
,则它将从文件系统或类路径注册WireMock JSON存根,默认情况下为file:src/test/resources/mappings
。您可以使用注释中的stubs
属性自定义位置,这可以是资源模式(ant-style)或目录,在这种情况下,附加*/.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总是从src/test/resources/mappings 中加载映射以及 stubs属性中的自定义位置。要更改此行为,您还必须如下所述指定文件根。 |
使用文件指定存根体
WireMock可以从类路径或文件系统上的文件读取响应体。在这种情况下,您将在JSON DSL中看到响应具有“bodyFileName”而不是(文字)“body”。默认情况下,相对于根目录src/test/resources/__files
解析文件。要自定义此位置,您可以将@AutoConfigureWireMock
注释中的files
属性设置为父目录的位置(即,位置__files
是子目录)。您可以使用Spring资源符号来引用file:…
或classpath:…
位置(但不支持通用URL)。可以给出值列表,并且WireMock将在需要查找响应体时解析存在的第一个文件。
注意 | 当配置files 根时,它会影响自动加载存根(它们来自称为“映射”的子目录中的根位置)。files 的值对从stubs 属性明确加载的存根没有影响。 |
替代方法:使用JUnit规则
对于更常规的WireMock体验,使用JUnit @Rules
启动和停止服务器,只需使用WireMockSpring
便利类来获取Options
实例:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class WiremockForDocsClassRuleTests {
// Start WireMock on some dynamic port
// for some reason `dynamicPort()` is not working properly
@ClassRule
public static WireMockClassRule wiremock = new WireMockClassRule(
WireMockSpring.options().dynamicPort());
// A service that calls out over HTTP to localhost:${wiremock.port}
@Autowired
private Service service;
// Using the WireMock APIs in the normal way:
@Test
public void contextLoads() throws Exception {
// Stubbing WireMock
wiremock.stubFor(get(urlEqualTo("/resource"))
.willReturn(aResponse().withHeader("Content-Type", "text/plain").withBody("Hello World!")));
// We're asserting if WireMock responded properly
assertThat(this.service.go()).isEqualTo("Hello World!");
}
}
使用@ClassRule
表示服务器将在此类中的所有方法后关闭。