Я предполагаю, что вы используете известные репозитории данных Spring в своем производственном коде.Нечто подобное может находиться в вашем проекте:
@Repository
public interface ProductRepository extends ElasticsearchRepository<Product, String> {
Product findByName(String name);
}
Таким образом, вы можете настроить небольшой интеграционный тест случай, подобный следующему:
@SpringBootTest
@RunWith(SpringRunner.class)
public class QueryIndexIT {
@Autowired
private ProductRepository repo;
@Autowired
private ElasticsearchTemplate template;
@Test
public void queryRepo() {
assertThat(template.indexExists(Product.class)).isTrue();
Product savedProduct = repo.save(new Product(null, "the name", "n/a"));
Product foundProduct = repo.findByName("the name");
assertThat(foundProduct).isEqualTo(savedProduct);
}
}
}
Так что в основном вы 'Выполнив этот интеграционный тест с знакомым вам контекстом Spring, возможно, немного изменив его с помощью application-test.properties
.
Чтобы быть независимым от любых реальных серверов ElasticSearch в вашей сети, выможет также отделить себя с помощью Maven Docker Plugin .Обратите особое внимание на раздел executions
, указанный ниже в моем фрагменте pom.xml
.Он запускает новый контейнер ElasticSearch перед выполнением любых интеграционных тестов и удаляет его, как только тесты завершаются.Таким образом, вы начинаете каждый цикл тестирования с чистой и стабильной настройки теста:
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.28.0</version>
<configuration>
<showLogs>true</showLogs>
<verbose>true</verbose>
<removeVolumes>true</removeVolumes>
<allContainers>true</allContainers>
<images>
<image>
<name>elasticsearch:6.6.2</name>
<alias>elasticsearch</alias>
<run>
<ports>
<port>9200:9200</port>
<port>9300:9300</port>
</ports>
<env>
<ES_JAVA_OPTS>-Xms512m -Xmx512m</ES_JAVA_OPTS>
<cluster.name>docker-cluster</cluster.name>
<discovery.type>single-node</discovery.type>
</env>
</run>
</image>
</images>
</configuration>
<executions>
<execution>
<id>prepare-containers</id>
<phase>pre-integration-test</phase>
<goals>
<goal>stop</goal>
<goal>start</goal>
</goals>
</execution>
<execution>
<id>remove-containers</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
Более подробную информацию о ссылочном образе ElasticSearch Docker можно найти в его описании на Docker Hub .
Итак, вы заметили, что нет необходимости создавать отдельный индекс только для целей тестирования.Храните тестовый и производственный код (и конфигурируйте, где это возможно) близко друг к другу, чтобы избежать неожиданностей во время рабочего процесса.
Если вы хотите устранить возможные проблемы с вашей настройкой, вы также можете сравнить свой подход с работающим примеромкоторый я подготовил для вас в моем Github хранилище .
Просто попробуйте это с mvn clean verify -Dit.test=QueryIndexIT
.Веселитесь и возвращайтесь с вашими успехами или замечаниями!