在测试上下文xml中定义ElasticsearchIntegrationTest客户端

时间:2015-09-25 07:42:25

标签: spring elasticsearch integration-testing spring-data-elasticsearch

在我们的应用程序中,我们正在整合ES。 注入了ElasticsearchTemplate的存储库:

@Repository
public class ElasticSearchRepositoryImpl implements ElasticSearchRepository {
    private ElasticsearchTemplate elasticsearchTemplate;
    @Autowired
        public ElasticSearchRepositoryImpl(ElasticsearchTemplate elasticsearchTemplate){
            this.elasticsearchTemplate = elasticsearchTemplate;
        }

在测试方面,我们正在使用文档中定义的ElasticsearchIntegrationTest类。 测试有自己的上下文,但由于存储库正在使用@Repository注释进行注释,因此正在加载它,这使我在测试上下文中定义了ElasticsearchTemplate。 此时,我不想定义模板,因为如果是这样,我需要定义一个客户端,因为我将在测试中使用client()提供的ElasticsearchIntegrationTest,这将使没有意义。
我有不同的可能性:

  1. 在测试环境中排除存储库 - 这是其他bean使用的,我必须排除很多东西并处理很多问题,除此之外我不认为是干净的。

  2. 宣布没有客户的模板(我也不喜欢这种可能性):

  3. 在测试环境中使用模板定义中ElasticsearchIntegrationTest提供的客户端 - 我不知道如何执行此操作,欢迎任何提示。

  4. 非常欢迎任何帮助我的其他解决方案,示例或想法。 提前致谢

    对于我的解决方案2,我在这里发布了我的代码,无法在上面发布:

    <bean name="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
            <constructor-arg name="client"><null /></constructor-arg><!-- TODO: this client should be manually injected in the tests -->
        </bean>
    

1 个答案:

答案 0 :(得分:1)

从Spring应用程序中,使用Elasticsearch创建集成测试的最简单方法是实现嵌入式节点。

@Configuration
public class MyTestConfiguration {
    // create and start an ES node
    @Bean
    public Client client() {
        Settings settings = ImmutableSettings.builder()
                .put("path.data", "target/data")
                .build();

        Node node = NodeBuilder.nodeBuilder().local(true).settings(settings).node();
        return node.client();
    }

    // initialize your ES template
    @Bean
    public ElasticsearchTemplate elasticsearchTemplate(Client client) {
        return new ElasticsearchTemplate(client);
    }

}

如果您使用Spring Boot和Spring Data Elasticsearch,它将在提供任何配置时自动创建嵌入式节点。