Рубрики
Без рубрики

Мокинг RestTemplate весной

Простое руководство для насмешек при использовании Весенней RestTemplate.

Автор оригинала: baeldung.

1. Введение

Часто мы оказываемся с приложениями, которые выполняют своего рода веб-запрос. Когда дело доходит до тестирования такого поведения, у нас есть несколько варианты с весенними приложениями.

Я N этот быстрый учебник, мы будем смотреть на только несколько способов насмешливых таких звонков осуществляется только через РестТемплет .

Мы начнем тестирование с Mockito, популярной насмешливой библиотекой. Затем мы будем использовать Spring Test, который предоставляет нам механизм для создания макета сервера для определения взаимодействия сервера.

2. Использование Мокито

Мы могли бы использовать Мокито, чтобы издеваться над РестТемплет вполне. При этом подходе тестирование нашего сервиса будет таким же простым, как и любой другой тест с участием насмешливых .

Допустим, у нас простая Служба обслуживания класс, который получает сведения о сотрудниках через HTTP:

@Service
public class EmployeeService {
    
    @Autowired
    private RestTemplate restTemplate;

    public Employee getEmployee(String id) {
	ResponseEntity resp = 
          restTemplate.getForEntity("http://localhost:8080/employee/" + id, Employee.class);
        
	return resp.getStatusCode() == HttpStatus.OK ? resp.getBody() : null;
    }
}

Давайте реализуем наш тест для предыдущего кода:

@RunWith(MockitoJUnitRunner.class)
public class EmployeeServiceTest {

    @Mock
    private RestTemplate restTemplate;

    @InjectMocks
    private EmployeeService empService = new EmployeeService();

    @Test
    public void givenMockingIsDoneByMockito_whenGetIsCalled_shouldReturnMockedObject() {
        Employee emp = new Employee("E001", "Eric Simmons");
        Mockito
          .when(restTemplate.getForEntity(
            "http://localhost:8080/employee/E001", Employee.class))
          .thenReturn(new ResponseEntity(emp, HttpStatus.OK));

        Employee employee = empService.getEmployee(id);
        Assert.assertEquals(emp, employee);
    }
}

В вышеупомянутом тестовом классе JUnit мы впервые попросили Мокито создать манекен РестТемплет например, с использованием @Mock аннотация.

Затем мы аннотировали Служба обслуживания например, с @InjectMocks впрыснуть в него манекен экземпляр.

Наконец, в методе тестирования мы определили поведение нашего макета, используя Mockito, когда/тогда поддержку.

3. Использование весеннего теста

Модуль Spring Test включает макет сервера под названием MockRestServiceServer. С помощью этого подхода мы настраиваем сервер для возврата конкретного объекта, когда конкретный запрос отправляется через наш РестТемплет пример. Наконец, мы можем проверить () на этом сервере экземпляр ли все ожидания были выполнены или нет.

MockRestServiceServer на самом деле работает путем перехвата вызовов HTTP API с помощью MockClientHttpRequestFactory . Основываясь на нашей конфигурации, он создает список ожидаемых запросов и соответствующих ответов. Когда РестТемплет экземпляр вызывает API, он ищет запрос в своем списке ожиданий и возвращает соответствующий ответ.

Таким образом, это устраняет необходимость запуска сервера HTTP в любом другом порту для отправки макетов ответов.

Давайте создадим простой тест для того же getEmployee () например, с использованием MockRestServiceServer :

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = SpringTestConfig.class)
public class EmployeeServiceMockRestServiceServerUnitTest {

    @Autowired
    private EmployeeService empService;
    @Autowired
    private RestTemplate restTemplate;

    private MockRestServiceServer mockServer;
    private ObjectMapper mapper = new ObjectMapper();

    @Before
    public void init() {
        mockServer = MockRestServiceServer.createServer(restTemplate);
    }
    
    @Test                                                                                          
    public void givenMockingIsDoneByMockRestServiceServer_whenGetIsCalled_thenReturnsMockedObject()() {   
        Employee emp = new Employee("E001", "Eric Simmons");
        mockServer.expect(ExpectedCount.once(), 
          requestTo(new URI("http://localhost:8080/employee/E001")))
          .andExpect(method(HttpMethod.GET))
          .andRespond(withStatus(HttpStatus.OK)
          .contentType(MediaType.APPLICATION_JSON)
          .body(mapper.writeValueAsString(emp))
        );                                   
                       
        Employee employee = empService.getEmployee(id);
        mockServer.verify();
        Assert.assertEquals(emp, employee);                                                        
    }
}

В предыдущем фрагменте мы использовали статические методы из MockRestRequestMatchers и MockRestОтветчикисоздатели четко и читаемым образом определить ожидания и ответ на призыв REST:

import static org.springframework.test.web.client.match.MockRestRequestMatchers.*;      
import static org.springframework.test.web.client.response.MockRestResponseCreators.*;

Мы должны иметь в виду, что РестТемплет в тестовом классе должен быть тот же экземпляр, используемый в Служба обслуживания класс. Чтобы убедиться в этом, мы определили фасоль RestTemplate весной и автоматически подключили экземпляр как в тесте, так и в реализации:

@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

Использование MockRestServiceServer очень полезно, когда мы пишем наши интеграционные тесты и только нужно издеваться над внешними вызовами HTTP.

4. Заключение

В этой краткой статье мы обсудили несколько эффективных вариантов для насмешек над внешними вызовами REST API по HTTP при написании унитарных тестов.

Исходный код для вышеупомянутой статьи доступен более на GitHub .