【问题标题】:Mockito ElasticSearch Unit test in Spring BootSpring Boot 中的 Mockito ElasticSearch 单元测试
【发布时间】:2019-06-07 10:00:53
【问题描述】:

我正在尝试在 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

【问题讨论】:

  • 你发现了吗?

标签: spring-boot elasticsearch mockito


【解决方案1】:

首先:让我们澄清一下您要测试什么。

    1234563 出于集成测试的目的,将 Spring boot 应用程序(或其中的一部分,与 Elastic 通信相关)与弹性实例的测试版本一起实例化,然后调用您的服务并断言结果会更有用,数据进入elasticsearch。 出于这些目的,您可以使用ElasticSearch in docker container,它将在应用程序上下文初始化之前在测试范围内运行,并允许您测试来自 Spring 引导服务的所有通信。
  1. 如果它是检查服务如何处理 HTTP POST 请求以在 Elastic 中保存一些数据的测试 - 看看使用 @WebMvcTest - 它不会实例化整个应用程序,而只是开始特定的控制器。 Web Tests

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 2016-05-28
      • 2019-07-07
      • 2015-12-20
      • 1970-01-01
      • 2020-08-08
      相关资源
      最近更新 更多