我用Wiremock进行了Sprint Boot Integration测试,但由于某种原因,Wiremock没有提供存根响应,http请求将发送到实际的外部api。我是不是错过了什么?我可以从日志中看到,Wiremock服务器正在端口8888 上启动
<dependency>
<groupId>com.github.tomakehurst</groupId>
<artifactId>wiremock-jre8-standalone</artifactId>
<version>2.27.0</version>
<scope>test</scope>
</dependency>
@RunWith(SpringRunner.class)
@SpringBootTest(classes = GatewayApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class RegTypeIntegratedTest {
@LocalServerPort
private int port;
TestRestTemplate restTemplate = new TestRestTemplate();
HttpHeaders headers = new HttpHeaders();
ObjectMapper mapper = new ObjectMapper();
@Rule
public WireMockRule wireMockRule = new WireMockRule(options().port(8888));
@Test
public void testRegType()
throws JSONException, JsonParseException, JsonMappingException, FileNotFoundException, IOException {
wireMockRule.stubFor(post(urlPathMatching("{path}/.*/")).willReturn(
aResponse().withHeader("Content-Type", "application/json").withBody(new String(Files.readAllBytes(
Paths.get("path/regtypeResponse_stub.json"))))));
HttpEntity<String> entity = new HttpEntity<String>(null, headers);
ResponseEntity<String> response = restTemplate.exchange(
createURLWithPort("/{service-url-path}y/regTypes?regtype=I"), HttpMethod.GET, entity,
String.class);
String expected = new String(Files
.readAllBytes(Paths.get("path/regtypeResponse_expected.json")));
JSONAssert.assertEquals(expected, response.getBody(), true);
}
private String createURLWithPort(String uri) {
return "http://localhost:" + port + uri;
}
}
我认为您混淆了SpringBootTest中运行的两个不同服务器的信息。一方面,你告诉你的单元测试让你的实际Spring Boot应用程序在随机的网络端口上运行测试,以模拟对你的网络应用程序的真实调用。spring应用程序分配给您的这个端口正在拉入port
变量。
同时,您正在8888
端口上设置Wiremock,您也可以在日志中观察到这一点。
在测试中,您现在通过调用RestTemplate实例中引用的return "http://localhost:" + port...
为测试调用已启动的spring-boot应用程序的真实端口。
我认为,当你真的想调用你正在运行的spring应用程序时,你需要分开,当你想使用wiremock调用你的外部端点mock时。
您为WireMock服务器存根了POST
方法,但随后在TestRestTemplate
客户端中调用了GET
方法。
您也没有扩展路径变量{service-url-path}
。