Тестирование 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>
Другие вопросы по тегам