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

Java 用于测试服务的临时Neo4j数据库,java,junit,neo4j,spring-data-neo4j-4,Java,Junit,Neo4j,Spring Data Neo4j 4,我正在使用Neo4j数据库构建一个Spring应用程序。 我有一些服务,它们实现基本的数据库功能,比如持久化用户或通过用户名查找用户。 由于我实现了一些限制,例如不可能删除不存在的用户,所以我想测试我的服务。 我的愿望是进行一次测试,构建一个临时的Neo4j图形,如中所述。 但是另外,我想将我的UserService自动连接到测试中,对临时数据库执行一些操作,最后再次销毁临时数据库。 我希望我能用TestConfiguration解决这个问题,但因为我对Spring或Neo4j没有太多经验,所以

我正在使用Neo4j数据库构建一个Spring应用程序。 我有一些服务,它们实现基本的数据库功能,比如持久化用户或通过用户名查找用户。 由于我实现了一些限制,例如不可能删除不存在的用户,所以我想测试我的服务。 我的愿望是进行一次测试,构建一个临时的Neo4j图形,如中所述。 但是另外,我想将我的UserService自动连接到测试中,对临时数据库执行一些操作,最后再次销毁临时数据库。 我希望我能用TestConfiguration解决这个问题,但因为我对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");
  }
}
和下面的测试类

@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
  }
}
然而,我在destroy中得到了graphDB的NullPointer异常,我甚至不确定我是否走对了路。 也许有人有这样的例子吗? 即使是在临时数据库上集成测试我的服务的更好方法也是受欢迎的

谢谢和问候
Urr4看起来像是在使用SDN 4.x.-哪个版本

SDN 4.0版本

您将使用
InProcessServer
,而不是
RemoteServer
,它在可用的本地端口上内部启动
CommunityNeoServer
的新实例。它将管理关闭以及,所以它是理想的,并建议测试。 在您的配置中,使用此选项而不是
RemoteServer
-

@豆子 公共Neo4jServer Neo4jServer(){ 返回新的InProcessServer(); }

所需的依赖关系记录在中。 进一步阅读,请参阅本节中的测试部分

SDN 4.1 M1

InProcessServer
不再可用,您需要使用嵌入式驱动程序,该驱动程序将为您设置非永久图形数据库。 非永久嵌入式存储的
ogm.properties
应包含-

driver=org.neo4j.ogm.drivers.embedded.driver.EmbeddedDriver
所需的依赖关系记录在中。
可以找到将测试升级为使用SDN 4.1的示例。

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

SDN 4.0版本

您将使用
InProcessServer
,而不是
RemoteServer
,它在可用的本地端口上内部启动
CommunityNeoServer
的新实例。它将管理关闭以及,所以它是理想的,并建议测试。 在您的配置中,使用此选项而不是
RemoteServer
-

@豆子 公共Neo4jServer Neo4jServer(){ 返回新的InProcessServer(); }

所需的依赖关系记录在中。 进一步阅读,请参阅本节中的测试部分

SDN 4.1 M1

InProcessServer
不再可用,您需要使用嵌入式驱动程序,该驱动程序将为您设置非永久图形数据库。 非永久嵌入式存储的
ogm.properties
应包含-

driver=org.neo4j.ogm.drivers.embedded.driver.EmbeddedDriver
所需的依赖关系记录在中。
可以找到将测试升级为使用SDN 4.1的示例。

我使用以下配置进行测试

@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");
  }
}
@ContextConfiguration(classes = {MyTestingConfiguration.class})
@RunWith(SpringJUnit4ClassRunner.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class TSUserBeanTest {
  @Autowired
  private MyService myService;

  //testing 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");
  }
}
@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>

org.springframework.data

工作起来很有魅力。

我使用以下配置进行测试

@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");
  }
}
@ContextConfiguration(classes = {MyTestingConfiguration.class})
@RunWith(SpringJUnit4ClassRunner.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class TSUserBeanTest {
  @Autowired
  private MyService myService;

  //testing 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");
  }
}
@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>

org.springframework.data

工作起来很有魅力。

请提供堆栈跟踪请提供堆栈跟踪我稍后将尝试此功能,但乍一看它看起来非常好,谢谢!酷,如果它有效,请接受答案。如果没有,我们将提供帮助:-)我尝试过,但目前无法使其工作。我试着在你发布的博客中添加依赖项,但如果我使用PersistenceContext配置构建测试,它总是会出现加载失败的ApplicationContext异常,告诉我“未能实例化[javax.persistence.PersistenceContext]:指定的类是一个接口。我做错了什么吗?我是否需要以某种方式实现持久性上下文?我使用SDN4.0BTWFORGET,我是个白痴:)我以为PersistenceContext是neo4j测试配置,它会自动连接到测试中。我甚至没有看到,错误是JAVAX.PERSISTENCE.PersistenceContext。我现在要运行测试,所以感谢你的精彩回答:)我稍后会尝试这个,但乍一看它看起来真的很好,谢谢!酷,如果它有效,请接受答案。如果没有,我们将提供帮助:-)我尝试过,但目前无法使其工作。我试着在你发布的博客中添加依赖项,但如果我使用PersistenceContext配置构建测试,它总是会出现加载失败的ApplicationContext异常,告诉我“未能实例化[javax.persistence.PersistenceContext]:指定的类是一个接口。我做错了什么吗?我是否需要以某种方式实现持久性上下文?我使用SDN4.0BTWFORGET,我是个白痴:)我以为PersistenceContext是neo4j测试配置,它会自动连接到测试中。我甚至没有看到,错误是JAVAX.PERSISTENCE.PersistenceContext。我现在要运行测试了,所以感谢您的精彩回答:)不幸的是,这个解决方案再也帮不上忙了。“在SDN 4.1中,InProcessServer已被弃用。”谢谢提醒。当我升级时,我会记住。不幸的是,这个解决方案已经帮不上忙了。“在SDN 4.1中,InProcessServer已被弃用。”谢谢提醒。升级时我会记住的。