【问题标题】:Starting embedded servers before context loads in Spring Boot for testing在 Spring Boot 中加载上下文之前启动嵌入式服务器以进行测试
【发布时间】:2019-02-18 18:33:24
【问题描述】:

我现在正在使用 Spring Boot、Spring Data JPA 和 Spring Data Elasticsearch 处理 sample application。我希望能够将单元测试作为管道构建的一部分运行,但它们需要 Elasticsearch 在服务调用所述 ES 服务器时运行才能工作。 SQL 工作正常,因为我使用的是内存中的 H2 实例。

我已经实现了一些代码来尝试将 ES 作为“嵌入式”服务器启动。嵌入式服务器工作得很好,但至少据我所知,它似乎是在上下文加载之后启动的。最重要的是在ElasticSearchConfiguration 之后做到了。

我认为我需要将 AbstractElasticsearchTest 中的代码重构为一个单独的类,该类可以在 ElasticSearchConfiguration 生成客户端/模板之前运行,但我不知道该怎么做,也不知道如何谷歌所说的过程。

Spring Boot 中是否有一些机制可用于在运行任何配置之前启动嵌入式服务器?或者有什么方法可以在创建客户端/模板之前增强ElasticSearchConfiguration,但仅在运行单元测试时?

编辑: 所以,只是更具体一点......我正在寻找的是一种在“嵌入式​​”模式下运行 ES 5 或如何模拟 Spring Data ES 代码以使其适用于 CI 的方法/方式服务器。我知道,上面链接的代码目前正在混合单元测试和集成测试,因为它目前正在调用物理 ES 服务器。这就是我要纠正的:我应该能够存根/模拟足够多的基础 Spring Data 代码,以使单元测试认为它正在与真实交易对话。然后,我可以更改确定文档是否进入 ES 的测试,并将诸如预先输入搜索之类的东西测试为集成测试,这样它们就不会在 CI 或 Sonar 运行时运行。

【问题讨论】:

  • 你在做集成测试吗?您真的需要在测试用例中使用 Elastic Search 吗?
  • 如果有办法模拟 ES 部分,那么我可以这样做。当我存储 Hibernate 实体时,我正在存储 ES 文档,所以如果它被存根/模拟,我不在乎
  • Elasticsearch 有一个测试框架,您可以使用它运行嵌入式 ES 节点进行测试。见这里:(elastic.co/guide/en/elasticsearch/reference/current/…)。如果您想改为模拟,那么您应该模拟用于访问 ES 的外观。如果你没有那个,那么我认为你将不得不模拟 ES 客户端。
  • @Quagaar,谢谢!我认为这看起来正是我所需要的。

标签: spring spring-boot spring-data spring-data-elasticsearch


【解决方案1】:

好的,对于那些将来可能会回到这里的人,this commit 显示了我为使 ES 以“嵌入式”方式运行所做的更改。

具体细节是将节点作为“本地”启动,然后物理返回node.client()。然后在获取客户端的 Spring Bean 方法中,检查是否开启了“embedded”,如果是,则启动节点并返回它的 Client(本地),如果不正常构建客户端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-23
    • 2020-08-22
    • 2019-12-06
    • 2019-10-11
    • 2018-07-12
    • 1970-01-01
    • 2021-07-18
    • 2020-07-19
    相关资源
    最近更新 更多