在测试上下文中定义 ElasticsearchIntegrationTest 客户端 xml
Define ElasticsearchIntegrationTest client in the test context xml
在我们的应用程序中,我们正在集成 ES。
有一个注入了 ElasticsearchTemplate 的存储库:
@Repository
public class ElasticSearchRepositoryImpl implements ElasticSearchRepository {
private ElasticsearchTemplate elasticsearchTemplate;
@Autowired
public ElasticSearchRepositoryImpl(ElasticsearchTemplate elasticsearchTemplate){
this.elasticsearchTemplate = elasticsearchTemplate;
}
在测试方面,我们正在使用文档中定义的 ElasticsearchIntegrationTest class。
测试有自己的上下文,但由于存储库使用 @Repository
注释进行注释,因此正在加载它,这让我在测试上下文中定义了一个 ElasticsearchTemplate
。
在这一点上,我不想定义一个模板,因为如果这样我就需要定义一个客户端,因为我将在测试中使用 ElasticsearchIntegrationTest
提供的 client()
,这将使没意义。
我有不同的可能性:
在测试上下文中排除存储库 - 这被其他 bean 使用,我将不得不排除很多东西并处理很多问题,此外我认为它不干净。
声明没有客户端的模板(我也不喜欢这种可能性):
在测试上下文中的模板定义中使用 ElasticsearchIntegrationTest
提供的客户端 - 我不知道该怎么做,欢迎任何提示。
非常欢迎任何其他对我有帮助的解决方案、示例或想法。
提前致谢
对于我的解决方案 2,我 post 这里是我的代码,不能 post 它在上面:
<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>
在 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,它会在提供任何配置时自动创建一个嵌入式节点。
在我们的应用程序中,我们正在集成 ES。 有一个注入了 ElasticsearchTemplate 的存储库:
@Repository
public class ElasticSearchRepositoryImpl implements ElasticSearchRepository {
private ElasticsearchTemplate elasticsearchTemplate;
@Autowired
public ElasticSearchRepositoryImpl(ElasticsearchTemplate elasticsearchTemplate){
this.elasticsearchTemplate = elasticsearchTemplate;
}
在测试方面,我们正在使用文档中定义的 ElasticsearchIntegrationTest class。
测试有自己的上下文,但由于存储库使用 @Repository
注释进行注释,因此正在加载它,这让我在测试上下文中定义了一个 ElasticsearchTemplate
。
在这一点上,我不想定义一个模板,因为如果这样我就需要定义一个客户端,因为我将在测试中使用 ElasticsearchIntegrationTest
提供的 client()
,这将使没意义。
我有不同的可能性:
在测试上下文中排除存储库 - 这被其他 bean 使用,我将不得不排除很多东西并处理很多问题,此外我认为它不干净。
声明没有客户端的模板(我也不喜欢这种可能性):
在测试上下文中的模板定义中使用
ElasticsearchIntegrationTest
提供的客户端 - 我不知道该怎么做,欢迎任何提示。
非常欢迎任何其他对我有帮助的解决方案、示例或想法。 提前致谢
对于我的解决方案 2,我 post 这里是我的代码,不能 post 它在上面:
<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>
在 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,它会在提供任何配置时自动创建一个嵌入式节点。