тестирование REST API в весенней загрузке - PullRequest
1 голос
/ 03 апреля 2019

Как правильно смоделировать внешний вызов API внутри моего RestController.То есть my RestController на самом деле выполняет следующие шаги:

  1. преобразование в дату
  2. вызов внешнего API с данными
  3. ответ внешним API-ответом

Не удается скопировать / вставить из-за проблем безопасности, но в целом:

@RestController
public Class x{
RestTemplate y = new RestTemplate();

@RequestMapping(value="/someurl" , method=RequestMethod=POST)
public String myMethod(@RequestBody JsonNode myjson)
{
  //business logic
  ResponseEntity<String> response = restTemplate.exchange(url,HttpMethod,
                                          internalRequest,String.class);
  return response.getBody()
}

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Здесь вы создаете новый экземпляр RestTemplate.Вы можете рассмотреть определение bean-компонента RestTemplate в классе Configuration и автоматически связать его здесь, чтобы смоделировать и протестировать его с помощью инфраструктуры Mockito.

Тогда код в контроллере должен выглядеть примерно так:

@RestController
public Class Controller{

   @Autowired
   RestTemplate restTemplate;

bean-компонент RestTemplate должен быть определен в классе конфигурации, как показано ниже

@Configuration
public class Config {

  @Bean
  public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder.build();
  }
} 

Как только вышеприведенное будет сделано, вы можете смоделировать RestTemplate, как показано ниже

@RunWith(MockitoJUnitRunner.class)
public class ControllerTest {

  @Mock
  RestTemplate restTemplate;

  @InjectMocks
  Controller controller;

  @Test
  public void myMethodTest() {
     Mockito.when(restTemplate.exchange(Mockito.eq(your url), 
                 Mockito.eq(HttpMethod.your method), Mockito.<HttpEntity<your request 
                 class>> any(), Mockito.<Class<your response class>> 
                 any())).thenReturn(your response entity);
     String response = controller.myMethod(your request);
     Assert.assertThat(response, CoreMatchers.is((your response entity).getBody));
  }

Используя вышеупомянутое, вы можете утверждатьответ от поддельного шаблона restTemplate.

0 голосов
/ 03 апреля 2019

Я всегда использовал Wiremock для более сложной заглушки в моих интеграционных тестах.

Это библиотека, которую вы можете добавить как зависимость и которая позволит вам заглушить любую указанную конечную точку (даже внешнюю) в тестовом контексте.

Пример заглушки из документа проекта:

stubFor(get(urlEqualTo("/my/resource"))
            .withHeader("Accept", equalTo("text/xml"))
            .willReturn(aResponse()
                .withStatus(200)
                .withHeader("Content-Type", "text/xml")
                .withBody("<response>Some content</response>")));
...