【问题标题】:Spring Boot API Mocking In Production生产环境中的 Spring Boot API 模拟
【发布时间】:2020-09-25 11:01:05
【问题描述】:

我知道,我们可以在 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

【问题讨论】:

    标签: java spring-boot production-environment demo embedded-server


    【解决方案1】:

    解决方案 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 服务

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

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

    解决方案 2 的示例代码可通过here 获取,供您参考。

    【讨论】:

    • Sudhir 感谢您的回答,但我的项目中已经有不同的配置文件属性,例如(生产、测试​​和开发),因此这与使用不同的配置文件无关。在这里,我只想在生产中模拟 API 而不是测试配置文件。所以如果你声称 Wiremock 在这里工作,你能给我举个例子吗?
    • @Sha 我已经做了一个示例应用程序来演示这一点。您可以访问它here
    • Sudhir 感谢您的回答。请根据您的评论/代码更新您的答案。那我会批准的。
    • @Sha 我提供的代码示例基于我的答案中的解决方案 2(但嵌入了 WireMock 服务器)。我可以知道您为什么认为它与我的答案不同吗?
    • 请将其链接到您的答案中;示例代码:GitHub 链接...
    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 2021-04-09
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多