Elasticsearch Spring 启动集成测试
Elasticsearch Spring boot integration test
我正在寻找将嵌入式 elasticsearch 添加到我的 spring 启动集成测试的方法。
我查看了弹性搜索集成测试,但它不能与 spring 启动一起使用,因为两者应该使用不同的测试 运行ner。
我有一个 class 测试,不幸的是,它无法正常工作,但出现错误:
java.lang.IllegalStateException: No context information for thread:
Thread[id=1, name=main, state=RUNNABLE, group=main]. Is this thread
running under a class
com.carrotsearch.randomizedtesting.RandomizedRunner runner context?
Add @RunWith(class
com.carrotsearch.randomizedtesting.RandomizedRunner.class) to your
test class. Make sure your code accesses random contexts within
@BeforeClass and @AfterClass boundary (for example, static test class
initializers are not permitted to access random contexts).
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = App.class)
@WebAppConfiguration
@IntegrationTest("server.port:0")
public class TestExample extends ElasticsearchIntegrationTest {
TestRestTemplate testRestTemplate = new TestRestTemplate();
@Value("${local.server.port}")
int port;
@Test
public void testOne(){
ResponseEntity<String> results = testRestTemplate.getForEntity(String.format("http://localhost:%d/client/1", port), String.class);
System.out.print(results);
}
}
有没有人知道如何制作它们 运行 或者有什么替代品??
您实际上可以做您需要的,无需任何额外的 elasticsearch 测试依赖项。这个想法基本上是创建一个嵌入式节点,然后使用 NodeClient
与其通信。
为此,我创建了自己的 EmbeddedElasticsearchServer
class,它看起来(或多或少)像这样:
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;
}
}
然后,在 spring 配置中(我们称之为 integration-test-context.xml
)我这样做了:
<bean id="embeddedElasticsearchServer"
class="com.example.EmbeddedElasticsearchServer" />
<bean id="elasticsearchClient"
class="org.elasticsearch.client.node.NodeClient"
factory-bean="embeddedElasticsearchServer"
factory-method="getClient" />
然后你可以像这样在你的测试中自动装配客户端:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/integration-test-context.xml")
public abstract class AbstractElasticsearchIntegrationTest {
@Autowired
private Client elasticsearchClient;
// Your rests go here...
}
我正在寻找将嵌入式 elasticsearch 添加到我的 spring 启动集成测试的方法。
我查看了弹性搜索集成测试,但它不能与 spring 启动一起使用,因为两者应该使用不同的测试 运行ner。
我有一个 class 测试,不幸的是,它无法正常工作,但出现错误:
java.lang.IllegalStateException: No context information for thread: Thread[id=1, name=main, state=RUNNABLE, group=main]. Is this thread running under a class com.carrotsearch.randomizedtesting.RandomizedRunner runner context? Add @RunWith(class com.carrotsearch.randomizedtesting.RandomizedRunner.class) to your test class. Make sure your code accesses random contexts within @BeforeClass and @AfterClass boundary (for example, static test class initializers are not permitted to access random contexts).
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = App.class)
@WebAppConfiguration
@IntegrationTest("server.port:0")
public class TestExample extends ElasticsearchIntegrationTest {
TestRestTemplate testRestTemplate = new TestRestTemplate();
@Value("${local.server.port}")
int port;
@Test
public void testOne(){
ResponseEntity<String> results = testRestTemplate.getForEntity(String.format("http://localhost:%d/client/1", port), String.class);
System.out.print(results);
}
}
有没有人知道如何制作它们 运行 或者有什么替代品??
您实际上可以做您需要的,无需任何额外的 elasticsearch 测试依赖项。这个想法基本上是创建一个嵌入式节点,然后使用 NodeClient
与其通信。
为此,我创建了自己的 EmbeddedElasticsearchServer
class,它看起来(或多或少)像这样:
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;
}
}
然后,在 spring 配置中(我们称之为 integration-test-context.xml
)我这样做了:
<bean id="embeddedElasticsearchServer"
class="com.example.EmbeddedElasticsearchServer" />
<bean id="elasticsearchClient"
class="org.elasticsearch.client.node.NodeClient"
factory-bean="embeddedElasticsearchServer"
factory-method="getClient" />
然后你可以像这样在你的测试中自动装配客户端:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/integration-test-context.xml")
public abstract class AbstractElasticsearchIntegrationTest {
@Autowired
private Client elasticsearchClient;
// Your rests go here...
}