【问题标题】:Mocking third party service模拟第三方服务
【发布时间】:2019-03-15 12:16:08
【问题描述】:

如何模拟第三方服务而不实际调用它?我已经为 post 方法的其余控制器编写了单元测试用例。但它实际上不是在模拟服务,而是在调用服务。有什么解决办法吗?

【问题讨论】:

  • 您在下面已经有 3 个答案。这解决了你的问题吗?如果没有,我建议您在此处添加您的测试,然后让我们提供帮助!
  • 这是我的测试用例
  • 我无法在此处添加测试用例。
  • 这里我的意思是在你原来的帖子/问题中。

标签: junit mocking


【解决方案1】:

您可以通过多种方式模拟对第三方服务的调用。

  1. 使用依赖注入来获得对第三方服务的调用的测试版本。

Guice、Spring 等将允许您注入模仿第三方服务行为的依赖项。

  1. 使用 Mockito / Powermock 等框架

假设你有一个Object来控制对第三方服务的访问,你可以使用Mockito等框架来拦截对该Object的调用并返回具体的结果,而无需联系第三方服务。

这是一个与数据库https://examples.javacodegeeks.com/core-java/mockito/mockito-mock-database-connection-example/ 对话的示例

【讨论】:

    【解决方案2】:

    你有几个选择:

    (1) 使用adapter pattern 将您的应用程序逻辑与对第三方API 的调用分开。在您的单元测试中,您应该模拟适配器。有关此模式的更多详细信息,请参阅this article。缺点是适配器本身很难测试。

    (2) Stripe 等一些 API 提供了一种测试模式,您可以使用它进行测试。

    (3) 使用unmock。该库捕获 API 调用并返回可靠的模拟数据。您还可以使用它来测试服务器错误(“易碎模式”)和执行随机测试。

    请注意,我是 unmock 开发人员之一。

    【讨论】:

      【解决方案3】:

      这是一个使用 Mockito 的示例:

      @Test
      public void shouldReturnSituation() throws IOException {
      
          ResponseEntity<String> response = new ResponseEntity<String>(BIGDATA_RESPONSE, HttpStatus.OK);
      
          mockRestTemplateResponse(response);
      
          Object actualSituation = resolver.resolve(baseDto);
      
          assertEquals("REGULAR", actualSituation);
      
          verify(restTemplate).exchange(requestEntityCaptor.capture(), eq(String.class));
      
          assertEquals("http://example.com/any/01234567890", requestEntityCaptor.getValue().getUrl().toString());
      }
      

      下面是另一个例子:

      @Test
      public void shouldReturnFalseWhenNotFound() throws IOException {
      
          HttpClientErrorException exception = new HttpClientErrorException(HttpStatus.NOT_FOUND);
      
          doThrow(exception).when(restTemplate).exchange(any(RequestEntity.class), eq(String.class));
      
          Object result = resolver.resolve(baseDto);
      
          assertFalse((Boolean) result);
      }
      

      【讨论】:

        猜你喜欢
        • 2014-05-31
        • 1970-01-01
        • 2015-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-09
        • 2021-08-22
        • 1970-01-01
        相关资源
        最近更新 更多