2017-02-03 2 views
0

Поскольку я хочу использовать RestTemplate из Spring, я хочу использовать тот же класс, что и для Unit-Testing. Идея состояла в том, чтобы загрузить JSON-файл и сохранить его локально для целей тестирования. Поэтому я хотел бы изменить URI с HTTP на адрес File. Когда это как File-адрес я получаю ExcpetionRestTemplate для локального тестирования файлов

Exception in thread "main" java.lang.IllegalArgumentException: Object of class [sun.net.www.protocol.file.FileURLConnection] must be an instance of class java.net.HttpURLConnection

urlGETList = "http://api.geonames.org/countryInfoJSON?username=volodiaL"; 
RestTemplate restTemplate = new RestTemplate(); 
CountryInfoResponse results = restTemplate.getForObject(urlGETList, CountryInfoResponse.class); 

Любые идеи, как я могу использовать одни и те же классы для модульного тестирования?

ответ

0

Я думаю, вы могли бы изучить Wiremock.

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

В тестовом модуле настройки сервера wiremock так:

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

Затем вы можете установить заглушку с ответом файла, как это:

public void givenResponse(int statusCode, MediaType contentType, String bodyPath) { 
     String responseBody; 
     try (InputStream data = new ClassPathResource(bodyPath).getInputStream()) { 
      responseBody = copyToString(data, UTF_8); 
     } 

     stubFor(any(urlPathEqualTo(getWireMockUri().getPath())) 
       .willReturn(aResponse() 
         .withStatus(statusCode) 
         .withHeader("Content-Type", contentType.toString()) 
         .withHeader("Content-Length", String.valueOf(responseBody.length())) 
         .withBody(responseBody) 
       )); 
    } 

вы также можете поместить полный окурок в файл заглушки, как описано here

После этого вы можете проверить, если определенный г Equest было сделано:

verify(postRequestedFor(urlEqualTo("/form")) 
       .withHeader("Content-Type", containing(MULTIPART_FORM_DATA_VALUE))); 

Вы можете узнать больше о проверке here

Вы бы использовать RestTemplate делать запросы. Вам просто нужно настроить хост и порт, чтобы вы могли использовать localhost и порт wiremock в своих тестах.

+0

Thx для ответа. Мне нужно проверить это, но это звучит довольно многообещающе ... – LeO

+0

@LeO, что было результатом вашей проверки? Помогло ли это? –