WireMock On Spring 使用外部 Https 主机启动测试

WireMock On Spring Boot Test With External Https Host

在我的应用程序中,我有外部第三方 API 请求。我想通过模拟这个 API 请求来测试我的应用程序。

我的服务Class:

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);
    }
}

总结一下服务class,请求可以是get,post,delete,put。并且此请求将使用 headers 或 body 部分进行处理。然后将作为http请求处理。

我的测试class:

@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);
    }
}

当我像上面那样实现它时,模拟不起作用。有什么建议吗?

注意:我希望代码片段足以让您从整体上理解代码。

我解决了;

  1. 描述测试 api-url 和端口。因为 Wiremock 创建了嵌入式本地主机服务器。

所以在应用程序属性中:

application-test.properties: 
  - service.url: http://localhost:8484
application-prod.properties: 
  - service.url: https://external.com/v1

然后我的测试class:

@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);
}