Модульный тест Mockito ElasticSearch в Spring Boot - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь использовать Mockito в Spring Boot для написания модульного теста, который «имитирует» вызов моего экземпляра ElasticSearch. Теперь, поскольку в модульном тестировании вы не должны беспокоить внешние ресурсы, и, таким образом, с помощью Mockito, мой экземпляр ElasticSearch остановлен. Проблема в том, что мой UnitTest продолжает пытаться подключиться к моему экземпляру ElasticSearch, поэтому происходит сбой с сообщением «Соединение отказано». Вот мой тест:

import com.google.common.net.HttpHeaders;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.util.Base64Utils;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class ElasticSearchConnectionTest {

@Autowired
private MockMvc mvc;

@Value("${elasticsearch.user}")
private String user;

@Value("${elasticsearch.password}")
private String password;

private String myjson = "{ \"order\": \n" + "{ \n" + "\"id\":\"dbId\",\n" + "\"status\":\"completed\",\n" + "} \n" + "}";

@Test
public void contextLoads() throws Exception {

    this.mvc.perform(post("/order")
            .contentType(MediaType.APPLICATION_JSON)
            .content(myjson)
            .header(HttpHeaders.AUTHORIZATION, "Basic " +Base64Utils.encodeToString((user+":"+password).getBytes())))
            .andExpect(status().is2xxSuccessful());
  }
}

Сообщение об ошибке гласит: java.net.ConnectException: Connection refused

Я использую Java Low Level Rest Client для звонков на ElasticSearch

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Если вы хотите проверить свою служебную логику и эмулировать реальный вызов на основе упругого поиска, вы можете создать заглушку упругого поиска с помощью wiremock. (Обратите внимание, что это больше похоже на интеграционный тест).

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

0 голосов
/ 07 июня 2019

Прежде всего: давайте уточним, что вы хотите проверить.

  1. Если это тест, в котором вы хотите позвонить на конечную точку своей службы, а под ней сохранится некоторая информация в экземпляре Elastic - это больше похоже на интеграцию, а не на модульный тест,Для целей интеграционного тестирования более полезно создать экземпляр загрузочного приложения Spring (или его части, связанного с Elastic коммуникацией) вместе с тестовой версией эластичного экземпляра, а затем сделать запрос к вашей службе и в результате утвердить это.Данные попали в эластичный поиск.Для этих целей вы можете использовать ElasticSearch в Docker-контейнере , который будет запускаться в области тестирования до инициализации контекста приложения и позволит вам проверить все взаимодействия с ним из службы загрузки Spring.

  2. Если это тест для проверки того, как служба обрабатывает HTTP-запрос POST для сохранения некоторых данных в Elastic, - взгляните на использование @WebMvcTest - который изнутри не будет создавать экземпляр всего приложения,но только начальная часть для конкретного контроллера. Веб-тесты

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