如何在不实际调用第三方服务的情况下对其进行模拟?我已经为post方法的rest控制器编写了单元测试用例。但是,它实际上不是在嘲笑服务,而是在调用服务。有解决方案吗?
答案 0 :(得分:0)
您可以通过多种方法来模拟对第三方服务的呼叫。
Guice,Spring等将允许您注入将模仿第三方服务行为的依赖项。
假设您有一个控制对第三方服务的访问的对象,则可以使用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);
}