Прежде чем начать писать тест, вы должны немного изменить свой код.Прежде всего, было бы намного проще, если бы вы извлекли этот RestTemplate
и создали для него отдельный компонент, который вы бы добавили в свой контроллер.
Для этого добавьте что-то подобное в *Класс 1004 * или в вашем основном классе:
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
Кроме того, вы должны удалить new RestTemplate()
из вашего контроллера и автоматически подключить его, например:
@Autowired
private RestTemplate restTemplate;
Теперь, когда вы это сделали, вам будет гораздо проще ввести в ваши тесты макет RestTemplate
.
Для тестирования у вас есть два варианта:
- Либо mock
RestTemplate
и все методы, к которым вы пытаетесь получить доступ, используя фальшивый фреймворк (например, Mockito) - Или вы можете использовать
MockRestServiceServer
, который позволяет вам писать тесты, которые проверяют, являются ли URL-адресаправильно вызван, запрос совпадает и т. д.
Тестирование с помощью Mockito
Чтобы смоделировать ваш RestTemplate
с помощью Mockito, необходимо убедиться, что вы добавили следующую аннотацию кВаши тесты:
@RunWith(MockitoJUnitRunner.class)
Послет, вы можете сделать это:
@InjectMocks
private MyController controller;
@Mock
private RestTemplate restTemplate;
И теперь вы можете настроить свои тесты следующим образом:
@Test
public void testgetMasterDataView() throws IOException {
MasterDataViewDTO dto = new MasterDataViewDTO();
when(restTemplate.getForObject("http://localhost:8089/*********", MasterDataViewDTO.class)).thenReturn(dto);
ResponseEntity<MasterDataViewDTO> response = controller.getMasterDataView();
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(response.getBody()).isEqualTo(dto);
}
Вы можете издеваться над DTO, как вы это делали в своем тесте, но вы нене нужно, и я не думаю, что это принесет какую-то пользу.То, что вам действительно нужно сделать, - это вызов restTemplate.getForObject(..)
.
Тестирование с помощью MockRestServiceServer
Другой подход заключается в использовании MockRestServiceServer
.Чтобы сделать это, вы должны использовать следующие аннотации для вашего теста:
@RunWith(SpringRunner.class)
@RestClientTest
А затем вам нужно будет автоматически подключить контроллер и MockRestServiceServer
, например:
@Autowired
private MyController controller;
@Autowired
private MockRestServiceServer server;
И теперь вы можете написать такие тесты:
@Test
public void testgetMasterDataView() throws IOException {
server
.expect(once(), requestTo("http://localhost:8089/*********"))
.andExpect(method(HttpMethod.GET))
.andRespond(withSuccess(new ClassPathResource("my-mocked-result.json"), MediaType.APPLICATION_JSON));
ResponseEntity<MasterDataViewDTO> response = controller.getMasterDataView();
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
// TODO: Write assertions to see if the DTO matches the JSON structure
}
Помимо проверки соответствия вашего фактического вызова REST, это также позволяет вам проверить, работает ли ваш JSON-to-DTO.