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