Спок модульное тестирование для тестирования RestTemplate.postForEntity - PullRequest
0 голосов
/ 23 марта 2020

Я новичок в модуле модульного тестирования Спока. Я умею писать тестовые примеры, используя Спок для простой логики. Теперь я пишу то же самое для Rest API.

Я использую RestTemplate Spring для выполнения запросов GET и POST. Я видел номер примера в Google для запроса GET (например, WireMock). Но недостаточно информации, чтобы дать разъяснения о том, как писать тестовые случаи для запросов POST.

Вот мой пример кода, который написан на Junit. Я должен преобразовать то же самое в Спока (я могу это сделать).

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.web.client.RestTemplate;

import com.github.tomakehurst.wiremock.junit.WireMockRule;

@RunWith(SpringJUnit4ClassRunner.class)
@AutoConfigureMockMvc
@ActiveProfiles(value = "integration")
@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class LocalControllerTest {

  @Rule
  public WireMockRule wireMockRule = new WireMockRule(9999);

  @Before
  public void setUp() {
    mockRemoteService();
  }

  @Test
  public void testLocalServiceWithMockedRemoteService() throws Exception {
    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<String> response = restTemplate.getForEntity("http://localhost:8080/localService", String.class);
    org.junit.Assert.assertEquals("Input : request from client endpoint, Message : mocked remote service response", response.getBody());
  }

  private void mockRemoteService() {
    stubFor(get(urlEqualTo("/remote"))
        .willReturn(aResponse()
            .withStatus(200)
            .withHeader("Content-Type", "application/json")
            .withBodyFile("remoteServiceResponse.json")));
  }

}

Основная проблема заключается в том, что, хотя я и писал тестовые случаи, вызов на самом деле происходит со службой (которая находится на моем локальном хосте) что я не ожидаю, чтобы это произошло. Есть ли способ локально макетировать данные и вызывать фиктивную конечную точку для запроса POST, используя платформу Spock? Я не знаю много о том, чтобы издеваться над фиктивной конечной точкой.

Ваша помощь высоко ценится.

Спасибо.

...