2

我知道,我们可以在 Spring-Boot 中轻松地在测试范围内模拟我们的代码。在这里,我想尝试在 Spring Boot 中创建一个演示生产范围/配置文件。在这个配置文件中,我想使用模拟场景。

例如,在我的代码中,有第三方 API 调用:

String API_URL = "https://external.com/v1/%s";
private CloseableHttpClient httpClient;
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);
    }
} 

有没有办法在生产中模拟它?或者更好的方法;有没有办法像(wiremock)一样为它创建嵌入式服务器?

注意:我已经在我的项目中实现了不同的配置文件属性,例如(生产、测试​​和开发),因此这与使用不同的配置文件无关。在这里,我只想在生产环境中模拟 API,而不是在测试配置文件中模拟 API。当然对于演示配置文件,我将创建 demo.properties

4

1 回答 1

2

解决方案1:

可以通过以下配置实现该行为

@Configuration
@Profile("!demo")
public class ProductionConfiguration {

    // Real configuration
}


@Configuration
@Profile("demo")
public class ProductionConfiguration {

    // Mock configuration
}

由于@MockBean注释是 spring 测试依赖项的一部分,因此在部署应用程序时它将不可用。您需要自己创建模拟Type mockObj = Mockito.mock(Type.class)

但这需要mockito将依赖项打包为生成的工件的一部分。

解决方案2:(推荐)

  • 将 API URL 外部化到属性文件。
  • 创建一个单独的属性文件application-demo.properties用于演示目的
  • 更新此属性文件中的 URL 以连接到外部WireMock服务

这可确保您的生产工件不需要包含仅用于演示目的的不必要的依赖项。

如果需要,您可以选择在配置文件处于活动状态时启动嵌入式WireMock服务器demo。但这意味着相关的依赖项必须要么是您的依赖项的一部分,要么在类路径中可用。如果可能,最好将 WireMock 作为外部服务运行。

此处提供了解决方案 2 的示例代码供您参考。

于 2020-06-06T09:38:29.997 回答