Тестирование Neo4j с Spring Boot и встроенным драйвером
проблема
Я строю приложение, используя базу данных Neo4j. Мне нравится тестировать некоторые пользовательские запросы Cypher, используя Spring Boot @DataNeo4jTest
аннотации (см. также Spring Boot Test - Neo4j), но я запускаю одну из следующих проблем:
- Тест пытается подключиться к экземпляру Neo4j с помощью драйвера BOLT.
- Тест не может загрузить встроенный драйвер.
подробности
Мои зависимости управляются с помощью Maven в соответствии со справочной документацией Spring Data Neo4j. Раздел 10.3.1 документации SDN объясняет:
По умолчанию SDN будет использовать драйвер BOLT для подключения к Neo4j, и вам не нужно объявлять его как отдельную зависимость в вашем pom. Если вы хотите использовать встроенные драйверы или драйверы HTTP в своем производственном приложении, вы также должны добавить следующие зависимости. (Эта зависимость от встроенного драйвера не требуется, если вы хотите использовать только встроенный драйвер для тестирования. Дополнительные сведения см. В разделе " Тестирование" ниже).
Поэтому соответствующие части моего pom.xml
являются:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi=...>
...
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
...
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
<dependency>
<groupId>org.neo4j.test</groupId>
<artifactId>neo4j-harness</artifactId>
<version>3.3.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
...
</project>
мой main/resources/application.yml
является:
spring:
data:
neo4j:
uri: bolt://localhost
username: <username>
password: <password>
мой test/resources/application.yml
является:
spring.data.neo4j.uri: file:///neo4j.db
Без test/resources/application.yml
Я получаю следующее исключение, которое, как я полагаю, вызвано использованием драйвера BOLT:
org.springframework.transaction.CannotCreateTransactionException: Could not open Neo4j Session for transaction;
nested exception is org.neo4j.driver.v1.exceptions.AuthenticationException: The client is unauthorized due to authentication failure.
С test/resources/application.yml
Я получаю следующее исключение:
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'neo4jAuditionBeanFactoryPostProcessor': Unsatisfied dependency expressed through constructor parameter 0;
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration.class]: Bean instantiation via factory method failed;
nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.neo4j.ogm.session.SessionFactory]: Factory method 'sessionFactory' threw exception;
nested exception is org.neo4j.ogm.exception.core.ConfigurationException: Could not load driver class org.neo4j.ogm.drivers.embedded.driver.EmbeddedDriver
Вопросы
- Отсутствуют ли какие-либо зависимости?
- Неправильная ли конфигурация?
- У кого-нибудь есть ссылка на рабочий пример с использованием аннотации Spring Boot
@DataNeo4jTest
?
Любое предложение приветствуется.
2 ответа
Я нашел решение своей проблемы. Похоже, что драйвер BOLT также используется по умолчанию для тестирования, что сбивает с толку, учитывая документацию Spring Data Neo4j (SDN). Наконец, pom.xml
из проекта GitHub мне помогли фильмы-java-spring-data-neo4j. Я добавил следующую тестовую зависимость в мой pom.xml
:
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-embedded-driver</artifactId>
<version>${neo4j-ogm.version}</version>
<scope>test</scope>
</dependency>
Я держал test/resources/application.yml
но убрал строку:
spring.data.neo4j.uri: file:///neo4j.db
Теперь тестовый контекст начинается со встроенного драйвера и создает временный файл базы данных, например file:/C:/Users/Me/AppData/Local/Temp/neo4j.db6943517458205762238/
это здорово. Я могу получить чистый экземпляр базы данных для каждого метода тестирования.
Надеюсь, этот ответ поможет другим, у кого такая же проблема. Я рад предоставить более подробную информацию, если это необходимо.
@DataNeo4JTest
отлично работает с Spring Boot 2.x
,
Пример теста:
@RunWith(SpringRunner.class)
@DataNeo4jTest
public class WidgetRepositoryTest {
@Autowired
private WidgetRepository repository;
private Widget widget;
@Before
public void setUp() {
widget = WidgetTestData.builder().build();
}
@Test
public void itShouldSaveAndRetrieve() {
final Widget saved = repository.save(widget);
assertThat(saved.getId()).isNotNull();
assertThat(saved.getName()).isEqualTo(widget.getName());
final Optional<Widget> found = repository.findById(saved.getId());
assertThat(found).hasValueSatisfying(w-> {
assertThat(w.getId()).isEqualTo(saved.getId());
assertThat(w.getName()).isEqualTo(saved.getName());
});
}
}
Связанные с Neo4J зависимости в моем Maven POM:
<dependency>
<groupId>org.neo4j.test</groupId>
<artifactId>neo4j-harness</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-embedded-driver</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>