Java Elasticsearch弹簧靴集成测试
我正在寻找将嵌入式elasticsearch添加到spring boot集成测试中的方法 我研究了弹性搜索集成测试,但它不能与SpringBoot一起工作,因为两者应该使用不同的测试运行程序 我有一个类测试,如下所示,不幸的是,它不工作,错误: java.lang.IllegalStateException:没有线程的上下文信息: 线程[id=1,name=main,state=RUNNABLE,group=main]。这是线吗 在教室里跑步 com.carrotsearch.randomizedtesting.RandomizedRunner运行程序上下文? 添加@RunWith(类 com.carrotsearch.randomizedtesting.RandomizedRunner.class)添加到 考试班。确保您的代码可以访问其中的随机上下文 @BeforeClass和@AfterClass边界(例如,静态测试类 不允许初始值设定者访问随机上下文)Java Elasticsearch弹簧靴集成测试,java,
elasticsearch,spring-boot,integration-testing,Java,
elasticsearch,Spring Boot,Integration Testing,我正在寻找将嵌入式elasticsearch添加到spring boot集成测试中的方法 我研究了弹性搜索集成测试,但它不能与SpringBoot一起工作,因为两者应该使用不同的测试运行程序 我有一个类测试,如下所示,不幸的是,它不工作,错误: java.lang.IllegalStateException:没有线程的上下文信息: 线程[id=1,name=main,state=RUNNABLE,group=main]。这是线吗 在教室里跑步 com.carrotsearch.randomize
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(类=App.class)
@WebAppConfiguration
@IntegrationTest(“服务器端口:0”)
公共类测试示例扩展ElasticsearchIntegrationTest{
TestRestTemplate TestRestTemplate=新的TestRestTemplate();
@值(${local.server.port}”)
国际港口;
@试验
公共void testOne(){
ResponseEntity结果=testRestTemplate.getForEntity(String.format(“http://localhost:%d/client/1“,端口),字符串。类);
系统输出打印(结果);
}
}
有没有人知道如何让它们运行,或者什么是替代方案???您实际上可以做您需要的事情,而无需任何额外的elasticsearch测试依赖项。其基本思想是创建一个嵌入式节点,然后使用与它通信 为此,我创建了自己的
EmbeddedElasticsearchServer
类,看起来(或多或少)如下:
public class EmbeddedElasticsearchServer implements InitializingBean {
public EmbeddedElasticsearchServer() {
ImmutableSettings.Builder elasticsearchSettings = ImmutableSettings.settingsBuilder()
.put("http.enabled", "false")
.put("path.data", "target/elasticsearch-data");
node = nodeBuilder()
.local(true)
.settings(elasticsearchSettings.build())
.node();
client = node.client();
}
@Override
public void afterPropertiesSet() throws Exception {
// Initialization stuff:
// - create required indices
// - define mappings
// - populate with test data
}
public Client getClient() {
return client;
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/integration-test-context.xml")
public abstract class AbstractElasticsearchIntegrationTest {
@Autowired
private Client elasticsearchClient;
// Your rests go here...
}
然后,在spring配置中(我们称之为integrationtestcontext.xml
),我这样做了:
<bean id="embeddedElasticsearchServer"
class="com.example.EmbeddedElasticsearchServer" />
<bean id="elasticsearchClient"
class="org.elasticsearch.client.node.NodeClient"
factory-bean="embeddedElasticsearchServer"
factory-method="getClient" />
这个怎么样?我已经看过了。首先我不使用spring数据,其次我需要嵌入式版本的ES。非常感谢您的回答。我会尝试一下,然后接受答案。:)这个答案对我帮助很大。我花了一整天的时间试图制作一个版本的org.elasticsearch.test.InternalTestCluster,我可以将它嵌入一个JerseyTest中。这使事情变得容易多了。需要注意的一点是,确保在某个位置关闭节点和客户端。它们需要清理。如果对其他人有帮助,这只在path.data是绝对路径(使用ES 1.7.3)时对我有效。根据,NodeBuilder已被删除,应该直接使用Node类。如果在集成测试中使用Node client,则无法创建ElasticSearchCrudepository bean。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/integration-test-context.xml")
public abstract class AbstractElasticsearchIntegrationTest {
@Autowired
private Client elasticsearchClient;
// Your rests go here...
}