java - 使用外部 Https 主机进行 Spring Boot 测试的 WireMock

标签 java spring-boot mocking spring-boot-test wiremock

在我的应用程序中,我有外部第三方 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);
    }
}

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

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

最佳答案

我解决了这个问题;

  1. 描述测试 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/

相关文章:

java - 从流程实例中获取变量映射

java - 无法使用 Spring Boot 将 ArrayList 中超过 2 个元素保存到 MySQL?

spring - Spring boot loader 的组和 Artifact ID 是什么?

java - Mockito中是否有类似于Junit Setup Method的东西

java - 如果单例类本身正在使用 PowerMock 进行测试,如何模拟该类的私有(private)方法?

java - 答案返回0

java - 如何从子调用父私有(private)方法?

java - Spring Boot 可选的多部分 POST 请求

java - Spring 启动 MailConnectException : Couldn't connect to host, 端口 : localhost, 25;超时-1;

python - django模板中的模拟方法调用