【问题标题】:How do I mock a REST server with with multiple endpoints in the same test in Java?如何在 Java 的同一测试中模拟具有多个端点的 REST 服务器?
【发布时间】:2017-11-17 23:05:36
【问题描述】:

我正在尝试测试一种 Java 方法,该方法向远程 REST 服务器发出请求以检索一些 JSON 数据,从该 JSON 中提取一个 ID,然后使用该 ID 在不同端点向同一服务器发出另一个请求.

使用 Mockito 的 MockRestServiceServer,我可以成功地模拟和测试期望对一个端点发出单个请求的服务器,但似乎我无法使用它来创建具有一组具有自己期望和响应的预定义端点的服务器。

为了测试向远程服务器发出多个不同请求的单个函数,我如何模拟具有多个端点的服务器?

【问题讨论】:

  • 尽管我相信您已经连贯地编写了您的问题,但我很难理解为什么您不能只提出多个请求。向第一个端点发送请求,解析 JSON 响应,然后使用先前解析的 JSON 向不同端点之一提交新请求,并根据需要重复多次。 Mockito 的 MockRestServiceServer 可能在其服务器的 API 中有一些代码可以让您执行此操作,因此不妨深入研究他们的文档。
  • 我正在尝试在进行两个 API 调用的 Web 脚本中测试单个函数。据我所知,我不能先发制人地在 MockRestServiceServer 上定义两个端点,然后运行该方法,以便在调用该函数时两个端点都存在于模拟服务器中。
  • @AdvillPill 好的,一个好的短期修复可能是只运行两个 MockRestServiceServer,每个都有自己的端点。
  • @Shn_Android_Dev,我已经尝试过这样做。似乎创建一个新的 MockRestServiceServer 实例会覆盖之前的实例。
  • 我的意思是,你的服务调用外部api时的顺序有关系吗?如果是,则 mockedCall 需要遵循该顺序。如果代码(生产)不关心订单,您的答案是正确的。

标签: java json rest mockito functional-testing


【解决方案1】:

所以我实际上能够解决我的问题。诀窍是手动创建您自己的 MockRestServiceServerBuilder 来构建您的 MockRestServiceServer 而不是使用 createServer(RestTemplate) 或 bindTo(RestTemplate).build() 方法,如下所示:

MockRestServiceServer.MockRestServiceServerBuilder builder = 
    MockRestServiceServer.bindTo(restTemplate);
builder.ignoreExpectOrder(true);
MockRestServiceServer server = builder.build();

通过这样做,MockRestServiceServer 中的底层 RequestExpectationManager 字段被初始化为 UnorderedRequestExpectationManager,允许您匹配请求而不管它们的发出顺序。这解决了我很多头疼的问题。

【讨论】:

    【解决方案2】:

    我的回答假设您使用的是 SpringBoot,但这个想法可以通用。

    让你的类依赖于 RestOperations 接口,这样你就可以在测试时传递一个存根。

    被测类

    public class Foo {
      private final RestOperations restOperations;
    
      public Foo(RestOperations restOperations) {
        this.restOperations = restOperations;
      }
    }
    

    测试

      public void test() {
        Foo foo = new Foo(new MyStub());
      }
    

    依赖于抽象,而不是具体的实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      相关资源
      最近更新 更多