使用 SpringBoot 配置文件模拟 REST API 调用

Posted

技术标签:

【中文标题】使用 SpringBoot 配置文件模拟 REST API 调用【英文标题】:Mocking REST API calls with SpringBoot profiles 【发布时间】:2020-05-22 17:27:57 【问题描述】:

我最近开始使用 Spring,不确定如何解决这个问题。我有一个调用远程 REST API 的 Spring 引导程序。例如带有getAddress(String user) 方法的AddressService 类,它进行HTTP 调用并返回JSON 响应。我想为开发目的设置 Spring 配置文件localdevuatprod

当程序使用local 配置文件运行时,我想用预期的 JSON 响应“模拟”这些外部 API 调用,所以我可以测试逻辑,但是当它在任何其他配置文件中运行时我想拨打实际电话。我该怎么做呢?根据我的阅读,人们有很多方法可以解决这个问题,使用WireMockRestTemplateMockito 等。我很困惑哪条路该走。

任何建议将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

WireMock,Mockit 用于单元测试,模拟真实的请求。这里的例子: How do I mock a REST template exchange?

当你需要一个带有模拟的运行实现时,我认为最简单的方法是你有一个接口

public interface AdressAdapter 
    public List<Adress> getAddress(String name);

还有两种不同的实现,具体取决于配置文件。

@Profile("local")
public class DummyAdress implements AdressAdapter
    @Override
    public List<Adress> getAddress(String name) 
        //Mock here something
        return null;
    

!在这种情况下表示 NOT 语言环境配置文件。

@Profile("!local")
public class RealAdress implements AdressAdapter
    @Override
    public List<Adress> getAddress(String name) 
        //Make Restcall
        return null;
    

【讨论】:

【参考方案2】:

您可以根据您的个人资料使用不同的application.properties 文件。这样,您只需将 url 更改为 local 配置文件的模拟服务器。

所以你要做的是:

    在您的resources 文件夹中创建另一个application.properties,命名为:application-local.properties。 更改所需服务的网址。 使用 VM 选项 -Dspring.profiles.active=local 启动您的应用程序。

这是一个link,它很好地描述了您想要实现的目标。

对于您的模拟服务器,您可以使用 Wiremock、Mountebank、Postman、... 可以单独启动并模拟特定端点以返回您想要的。

【讨论】:

以上是关于使用 SpringBoot 配置文件模拟 REST API 调用的主要内容,如果未能解决你的问题,请参考以下文章

springboot项目使用WireMock伪造REST服务

SpringBoot2---对rest风格的支持

Spring Boot - 模拟对外部 API 的 POST REST 请求

SpringBoot中使用rabbitmq,activemq消息队列和rest服务的调用

SpringBoot 项目配置 Swagger 接口api 搭建 REST

springboot配置swagger-rest文档