模拟第三方服务

时间:2019-03-15 12:16:08

标签: junit mocking

如何在不实际调用第三方服务的情况下对其进行模拟?我已经为post方法的rest控制器编写了单元测试用例。但是,它实际上不是在嘲笑服务,而是在调用服务。有解决方案吗?

3 个答案:

答案 0 :(得分:0)

您可以通过多种方法来模拟对第三方服务的呼叫。

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

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

  1. 使用Mockito / Powermock等框架

假设您有一个控制对第三方服务的访问的对象,则可以使用Mockito和其他框架来拦截对该对象的调用并返回特定结果,而无需联系第三方服务。

以下是与数据库https://examples.javacodegeeks.com/core-java/mockito/mockito-mock-database-connection-example/交谈的示例

答案 1 :(得分:0)

您有几种选择:

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

(2)某些API,例如Stripe提供了可用于测试的测试模式。

(3)使用unmock。该库捕获API调用并提供可靠的模拟数据。您还可以将其用于测试服务器错误(“不稳定模式”)和执行随机测试。

请注意,我是取消模拟的开发人员之一。

答案 2 :(得分:0)

以下是使用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);
}