用于测试服务的临时 Neo4j 数据库

Temporary Neo4j database to test services

我正在使用 Neo4j 数据库构建一个 Spring 应用程序。 我有一些服务,它们实现了基本的数据库功能,例如保留用户或通过用户名查找用户。 由于我实施了一些限制,例如无法删除不存在的用户,我想测试我的服务。 我的愿望是进行一个构建临时 Neo4j graphdb 的测试,如 http://neo4j.com/docs/stable/tutorials-java-unit-testing.html 中所述。 但另外我想将我的 UserService 自动连接到测试中,对临时数据库执行一些操作,最后再次销毁临时数据库。 我期待我可以用 TestConfigurations 解决这个问题,但由于我对 Spring 或 Neo4j 没有真正的经验,所以它并不那么简单。

我有以下配置

@Configuration
@EnableNeo4jRepositories(basePackages = "de.myapp")
@EnableTransactionManagement
public class UserTestConfiguration extends Neo4jConfiguration{

  @Bean
  public UserService userService() {
    return new UserBean();
  }

  @Bean
  public Neo4jServer neo4jServer() {
    //This is probably wrong since i really want to connect to the impermanent db
    return new RemoteServer("http://localhost:7474");
  }

  @Bean
  public SessionFactory getSessionFactory() {
    return new SessionFactory("de.myapp");
  }
}

以及下面的测试-class

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=TSUserTestConfiguration.class)
public class TSUserBeanTest {

  private GraphDatabaseService graphDb;

  @Autowired
  private TSUserService userService;

  @Before
  public void prepareTestDatabase() {
    graphDb = new TestGraphDatabaseFactory().newImpermanentDatabase();
  }

  @After
  public void destroyTestDatabase() {
    graphDb.shutdown();
  }

  @Test
  public void createUserTest() {
    TSUser user = new TSUser("TestUser", "TestEmail");
    //This should create the user in the impermanent db
    userService.persistUser(user);
    //assert stuff here
  }
}

但是,我在销毁中得到了 graphDB 的 NullPointer 异常,我什至不确定我的方法是否正确。 有人可能有这种情况的例子吗? 欢迎使用更好的方法在临时数据库上对我的服务进行集成测试。

感谢和问候 Urr4

看起来您正在使用 SDN 4.x。 - 哪个版本?

SDN 4.0 发布

您将使用 InProcessServer 而不是 RemoteServer,它会在可用的本地端口上内部启动 CommunityNeoServer 的新实例。它还可以管理关闭,因此非常适合并推荐用于测试。 在您的配置中,使用它代替 RemoteServer-

@豆子 public Neo4jServer neo4jServer() { return 新的 InProcessServer(); }

所需的依赖项记录在 reference guide 中。 进一步阅读,本blog post.

中的测试部分

SDN 4.1 M1

InProcessServer 不再可用,您需要使用嵌入式驱动程序,它会为您设置 Impermanent 图形数据库。 ogm.properties 对于临时嵌入式存储应该包含-

driver=org.neo4j.ogm.drivers.embedded.driver.EmbeddedDriver

所需的依赖项记录在 reference guide 中。 可以找到升级测试以使用 SDN 4.1 的示例 here.

我使用以下配置进行测试

@Configuration
@ComponentScan("my.services")
@EnableNeo4jRepositories("my.repos")
public class MyTestingConfiguration extends Neo4jConfiguration {

  @Override
  @Bean
  public Neo4jServer neo4jServer() {
    return new InProcessServer();
  }

  @Override
  public SessionFactory getSessionFactory() {
    return new SessionFactory("de.tsbros");
  }
}

及以下class进行测试

@ContextConfiguration(classes = {MyTestingConfiguration.class})
@RunWith(SpringJUnit4ClassRunner.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class TSUserBeanTest {
  @Autowired
  private MyService myService;

  //testing here
}

使用以下依赖项

<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-neo4j</artifactId>
  <version>${sdn.version}</version>
  <type>test-jar</type>
</dependency>

<dependency>
  <groupId>org.neo4j</groupId>
  <artifactId>neo4j-kernel</artifactId>
  <version>${neo4j.version}</version>
  <type>test-jar</type>
</dependency>

<dependency>
  <groupId>org.neo4j.app</groupId>
  <artifactId>neo4j-server</artifactId>
  <version>${neo4j.version}</version>
  <type>test-jar</type>
</dependency>

<dependency>
  <groupId>org.neo4j</groupId>
  <artifactId>neo4j-ogm</artifactId>
  <version>${neo4j-ogm.version}</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.neo4j.test</groupId>
  <artifactId>neo4j-harness</artifactId>
  <version>${neo4j.version}</version>
  <scope>test</scope>
</dependency>

一切都像描述的那样here 就像一个魅力。