首页 > 解决方案 > 如何为来自 RestTemplate 1 的基于 Rest 模板 2 的响应编写 Mockito

问题描述

 @Test
    public void getEventsByOrg() throws Exception {

        String mockResposne = getXMLFromFile("classpath:OrgResponse.xml");
        ResponseEntity<String> response = new ResponseEntity<>(mockResposne, HttpStatus.OK);
        when(restTemplate.exchange(any(String.class), any(), any(HttpEntity.class), any(Class.class)))
                .thenReturn(response);

        ResponseEntity<List<OCVEvents>> ocvEvents = eventService.getEventsByGlobalKey(eventIdOrg, traceId);
        verify(restTemplate).exchange(any(String.class), any(), captor.capture(), any(Class.class));

        Events event = ocvEvents.getBody().get(0);
        Events eventsPerson = new ObjectMapper().readValue(ResourceUtils.getFile("classpath:EventOrg.json"), Events.class);
        assertThat(event.getHeader()).isEqualTo(eventsPerson.getHeader());

现在我在 eventsService 中有另一个 Rest Call 如何为此编写单元测试

我需要点击一个 Rest API(1) 并获得响应,基于响应我需要点击另一个 Rest API (2) 我需要为这个类编写 mockit0

标签: spring-bootmockito

解决方案


如果您的服务类中有多个 rest api 调用,则必须模拟所有 api 调用以返回模拟数据以供您的测试运行。就像您模拟第一个 api 调用的响应一样,在测试中调用您的服务之前为第二个 api 调用添加一个模拟响应。而不是使用any()作为参数匹配器指定您将从代码中调用的特定 url 以区分两个 api 调用模拟。

如果您在 Springboot 上并spring-boot-test用于集成测试,那么您可以使用TestRestTemplate

TestRestTemplate testRestTemplate = new TestRestTemplate();
ResponseEntity<String> response = testRestTemplate.
  getForEntity(FOO_RESOURCE_URL + "/1", String.class);

assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));

或者如果你只是有一个使用 Mockito 的单元测试用例,那么:

@Mock
private RestTemplate restTemplate;

@InjectMocks
private EventService eventService = new EventService();

@Test
public void givenMockingIsDoneByMockito_whenGetIsCalled_shouldReturnMockedObject() {
    SomeObject instance = new SomeObject(“E001”, "Eric Simmons");
    Mockito
      .when(restTemplate.getForEntity(
        “http://localhost:8080/test/E001”, SomeObject.class))
      .thenReturn(new ResponseEntity(instance, HttpStatus.OK));

    SomeObject returnedObject = eventService.getEventsByGlobalKey(id);
    Assert.assertEquals(instance, returnedObject);
}

推荐阅读