【问题标题】:Mockito mocking restTemplate.postForEntityMockito 模拟 restTemplate.postForEntity
【发布时间】:2014-08-12 19:21:31
【问题描述】:

我正在尝试模拟 restTemplate.postForEntity 方法,

实际的方法调用是:

URI myUri = new URI(myString);
HttpEntity<String> myEntity ...


String myResponse = restTemplate.postForEntity(myUri, myEntity, String.class);

我的测试课是:

Mockito.when(restTemplate.postForEntity(any(URI.class), any(HttpEntity.class), eq(String.class))).thenReturn(response);

这不起作用;我尝试了其他几种排列也没有成功。任何建议表示赞赏,谢谢。

这不起作用我的意思是调用实际方法而不是模拟方法(因此不返回所需的结果等)

【问题讨论】:

  • 这不起作用信息量不是很大。
  • 只是一个不受欢迎的评论:模拟这种类通常是一种不好的做法。使用 Mock 的 TDD 的良好实践之一是模拟您不拥有的类。

标签: java unit-testing testing mocking mockito


【解决方案1】:

以下代码适用于我 - when(mockRestTemplate.postForEntity(anyString(), any(), eq(String.class))).thenReturn(response);

【讨论】:

  • 你是如何创建响应对象的?可以举个例子吗?
  • 私人 ResponseEntity createPaymentConfirmationResponse(){ return ResponseEntity.ok("something"); }
  • 这根本不起作用,甚至无法编译。无法解析方法 any()
【解决方案2】:

这对我有用 首先需要在测试类中模拟一个resttemplate

@Mock 
private RestTemplate mockRestTemplate;

由于 ResponseEntity 返回一个 Object,因此创建另一个方法,该方法返回包装在 ResponseEntity 中的预期响应

private ResponseEntity<Object> generateResponseEntityObject(String response, HttpStatus httpStatus){
    return new ResponseEntity<>(response, httpStatus);
}

在您的测试用例中,您现在可以按如下方式模拟预期响应

String string = "result";
when(mockRestTemplate.postForEntity(anyString(), any(), any()))
        .thenReturn(generateResponseEntityObject(string, HttpStatus.OK));

【讨论】:

  • 这根本不起作用,甚至无法编译。无法解析方法 any()
【解决方案3】:

您必须确保将 restTemplate 初始化为测试中的模拟

 RestTemplate restTemplate = mock(RestTemplate.class);

并且这个(模拟的)休息模板是您实际方法调用中使用的模板。你可以 在你的对象上有一个 setRestTemplate() 方法,你可以用它来设置 restTemplate:

 myTestObject.setRestTemplate(restTemplate);

Mocks 将从不只调用原始方法,因此如果发生这种情况,您可以确定您的实际方法没有使用 mock。 (真实的)模拟将返回您告诉他们的内容,或者返回 null。

【讨论】:

  • 如果在服务类中自动装配 TestTemplate 会怎样?
【解决方案4】:

我猜postForEntity 方法是最终方法 - 您可以使用 RestOperations 而不是 RestTemplate 来解决这个问题。

【讨论】:

    【解决方案5】:

    resttemplate 返回 ResponseEntity

    Postforentity 类似 ResponseEntitymyResponse= restTemplate.postForEntity(myUri, myEntity, StringToReturn.class);其中 StringToReturn 是要返回的任何类型(在您的情况下只是 String)

    【讨论】:

      猜你喜欢
      • 2020-11-29
      • 2014-06-16
      • 1970-01-01
      • 2021-12-28
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      相关资源
      最近更新 更多