在我的应用程序中,我有外部第三方 API 请求。我想通过模拟此 API 请求来测试我的应用程序。
我的服务等级:
String API_URL = "https://external.com/v1/%s";
public Result executeRequest(String apiVersion, String subUrl, HttpMethod httpMethod)
{
try
{
HttpRequestBase httpRequest;
String url = String.format(API_URL, subUrl);
if (httpMethod.equals(HttpMethod.GET))
{
httpRequest = new HttpGet(url);
}
else if (httpMethod.equals(HttpMethod.POST))
{
httpRequest = new HttpPost(url);
((HttpPost) httpRequest).setEntity(new StringEntity(requestBody, "UTF-8"));
}
...
headers.forEach(httpRequest::setHeader);
HttpResponse response = httpClient.execute(httpRequest);
}
catch (IOException e)
{
logger.error("IO Error: {}", e.getMessage());
return handleExceptions(e);
}
}
总结一下服务类,请求可以是get、post、delete、put。该请求将通过 header 或正文部分进行处理。然后将作为http请求处理。
我的测试类:
@SpringBootTest
@ActiveProfiles("test")
@RunWith(SpringRunner.class)
public class ServiceTest
{
private static final String API_URL = "https://external.com/v1";
@Autowired
private Service service;
@Autowired
protected Gson gson;
@Rule
public WireMockRule wireMockRule = new WireMockRule();
@Test
public void getResult_successfully()
{
Result result = new Result();
wireMockRule.stubFor(get(urlPathMatching("/subUrl"))
.willReturn(aResponse()
.proxiedFrom(API_URL)
.withStatus(200)
.withHeader("Content-Type", "application/json")
.withBody(gson.toJson(result))));
Result returnResult = service.executeRequest("/subUrl", GET);
assertThat(returnResult).isEqualTo(result);
}
}
当我像上面那样实现它时,模拟不起作用。有什么建议吗?
注意:我希望代码片段足以理解整体代码。
最佳答案
我解决了这个问题;
- 描述测试 api-url 和端口。因为 Wiremock 创建了嵌入式本地主机服务器。
所以在应用程序属性中:
application-test.properties:
- service.url: http://localhost:8484
application-prod.properties:
- service.url: https://external.com/v1
然后是我的测试类:
@ClassRule
public static WireMockRule wireMockRule = new WireMockRule(8484);
@Test
public void getResult_successfully()
{
Result result = new Result();
wireMockRule.stubFor(get(urlPathMatching("/subUrl"))
.willReturn(aResponse()
.proxiedFrom(API_URL)
.withStatus(200)
.withHeader("Content-Type", "application/json")
.withBody(gson.toJson(result))));
Result returnResult = service.executeRequest("/subUrl", GET);
assertThat(returnResult).isEqualTo(result);
}
关于java - 使用外部 Https 主机进行 Spring Boot 测试的 WireMock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62113775/