我正在寻找将嵌入式Elasticsearch添加到我的Spring Boot集成测试中的方法。
我研究了elasticsearch集成测试,但是它不能与Spring Boot一起使用,因为两者都应使用不同的测试运行器。
不幸的是,我有一个下面的类测试,它不能正常工作:
java.lang.IllegalStateException:没有线程的上下文信息:Thread [id = 1,name = main,state = RUNNABLE,group = main]。该线程是否在com.carrotsearch.randomizedtesting.RandomizedRunner运行器上下文环境下运行?将@RunWith(class com.carrotsearch.randomizedtesting.RandomizedRunner.class)添加到测试类。确保您的代码访问@BeforeClass和@AfterClass边界内的随机上下文(例如,不允许静态测试类初始化程序访问随机上下文)。
@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与之通信。
NodeClient
为此,我创建了自己的EmbeddedElasticsearchServer类(或多或少)如下:
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; } }
然后,在spring配置中(我们称之为integration-test-context.xml),我这样做:
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... }