шаблон макета отдыха для юнит-теста - PullRequest
1 голос
/ 06 марта 2019

Я хочу смоделировать RestTemplate в Spring Boot, где я делаю вызов REST внутри метода.Чтобы проверить контроллер микросервиса, который я создаю, я хочу протестировать методы внутри контроллера моего микросервиса.

Например:

@GetMapping(value = "/getMasterDataView", produces = { MediaType.APPLICATION_JSON_VALUE })
@CrossOrigin(origins = { "http://192.1**********" }, maxAge = 3000)
public ResponseEntity<MasterDataViewDTO> getMasterDataView() throws IOException {

    final String uri = "http://localhost:8089/*********";

    RestTemplate restTemplate = new RestTemplate();
    MasterDataViewDTO masterDataViewDTO = restTemplate.getForObject(uri, MasterDataViewDTO.class);

    return new ResponseEntity<>(masterDataViewDTO, HttpStatus.OK);

}

как это проверить с помощью насмешек?

Это то, что у меня есть:

@Test
    public void testgetMasterDataView() throws IOException {

    MasterDataViewDTO masterDataViewDTO= mock(MasterDataViewDTO.class);
    //String uri = "http://localhost:8089/*********"; 

    Mockito.when(restTemplate.getForObject(Mockito.anyString(),ArgumentMatchers.any(Class.class))).thenReturn(masterDataViewDTO);

    assertEquals("OK",inquiryController.getMasterDataView().getStatusCode());        
}

Я получаю сообщение об ошибке при запуске макета, вызывается метод getMasterDataView() и вызов REST внутри.он также вызывается и выдает ошибку.Как я могу написать свой тест, чтобы конечная точка REST не вызывалась?Если это возможно, я бы хотел сделать это с Мокито.

Ответы [ 2 ]

2 голосов
/ 06 марта 2019

Прежде чем начать писать тест, вы должны немного изменить свой код.Прежде всего, было бы намного проще, если бы вы извлекли этот RestTemplate и создали для него отдельный компонент, который вы бы добавили в свой контроллер.

Для этого добавьте что-то подобное в *Класс 1004 * или в вашем основном классе:

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

Кроме того, вы должны удалить new RestTemplate() из вашего контроллера и автоматически подключить его, например:

@Autowired
private RestTemplate restTemplate;

Теперь, когда вы это сделали, вам будет гораздо проще ввести в ваши тесты макет RestTemplate.

Для тестирования у вас есть два варианта:

  1. Либо mock RestTemplate и все методы, к которым вы пытаетесь получить доступ, используя фальшивый фреймворк (например, Mockito)
  2. Или вы можете использовать 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.

0 голосов
/ 06 марта 2019

Вы можете достичь этого, используя @RestClientTest и MockRestServiceServer. Пример, приведенный в их документации :

@RunWith(SpringRunner.class)
@RestClientTest(RemoteVehicleDetailsService.class)
public class ExampleRestClientTest {

    @Autowired
    private RemoteVehicleDetailsService service;

    @Autowired
    private MockRestServiceServer server;

    @Test
    public void getVehicleDetailsWhenResultIsSuccessShouldReturnDetails()
            throws Exception {
        this.server.expect(requestTo("/greet/details"))
                .andRespond(withSuccess("hello", MediaType.TEXT_PLAIN));
        String greeting = this.service.callRestService();
        assertThat(greeting).isEqualTo("hello");
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...