Spring Boot中的Mockito ElasticSearch Unit测试

时间:2019-06-07 10:00:53

标签: spring-boot elasticsearch mockito

我试图在Spring Boot中使用Mockito,以便编写一个单元测试来“模仿”对我的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 :(得分:0)

首先:让我们阐明您要测试的内容。

  1. 如果这是一个测试,则要在其中调用服务端点,并在其下将一些信息保存在Elastic实例中-它更像是集成,而不是单元测试。 出于集成测试的目的,实例化Spring Boot应用程序(或与弹性通信相关的部分应用程序)以及弹性实例的测试版本,然后调用您的服务并断言这一点更为有用。 ,数据进入elasticsearch。 为此,您可以使用ElasticSearch in docker container,它将在应用程序上下文初始化之前在测试范围内运行,并允许您从Spring引导服务测试与其进行的所有通信。

  2. 如果这是一项用于检查服务如何处理HTTP POST请求以在Elastic中保存一些数据的测试-请看一下使用@WebMvcTest-它在幕后不会实例化整个应用程序,而只是实例化了特定的控制器。 Web Tests

答案 1 :(得分:0)

如果您想测试服务逻辑并模拟针对Elastic-Search的实际调用,则可以使用Wiremock创建一个Elastic-Search存根。 (请注意,这听起来更像是集成测试)。

在单元测试中,您通常要针对代码的其他单元测试您的代码实现,而在集成测试中,您应针对外部依赖项测试整个服务。