0

我正在使用com.sun.jersey.test.framework.JerseyTest为我的 Jersey 应用程序创建 JUnit 测试。该应用程序使用 Neo4j 和 Spring Data 来加载数据并通过 REST API 将其返回。

测试使用我的 jersey neo4j spring data webapp 启动一个嵌入式 grizzly 服务器。之后,我可以调用休息请求并在 neo4j 数据库中创建节点。不幸的是,我的测试目前固定到单个 neo4j 数据库位置,因为这是在我的applicationContext.xml中配置的,如下所示:

<neo4j:config storeDirectory="/tmp/myapp/neo4jdb" /> 

如果我同时执行类似的测试,我的测试将失败,因为将使用相同的目录并且只有一个 neo4j 可以获得锁。

我知道SpringJUnit4ClassRunner但我不能使用它,因为我已经在我的嵌入式服务器中运行了一个 neo4j 实例。

@ContextConfiguration(locations = "classpath:/spring/applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
@Transactional

测试应该在一个随机目录中创建一个 neo4j 数据库。

问题:

  • 有什么方法可以更改 storeDirectory 并清除到 neo4j 数据库。更改 setupOnce 中的 storeDirectory 也会有所帮助。
  • 有什么办法可以清除neo4j 数据库。(我不能在我的测试中自动装配,因为它不是弹簧上下文的一部分)
4

1 回答 1

1

我现在使用基于 Java 的 bean 配置:

package com.gentics.sandboxmanager.service;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

import org.neo4j.kernel.EmbeddedGraphDatabase;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.neo4j.config.EnableNeo4jRepositories;
import org.springframework.data.neo4j.config.JtaTransactionManagerFactoryBean;
import org.springframework.data.neo4j.config.Neo4jConfiguration;
import org.springframework.data.neo4j.support.Neo4jExceptionTranslator;
import org.springframework.data.neo4j.support.Neo4jTemplate;
import org.springframework.data.neo4j.support.mapping.Neo4jMappingContext;

@EnableNeo4jRepositories(basePackages = "com.gentics.sandboxmanager.repository")
@Configuration
public class Neo4jConfig extends Neo4jConfiguration {

    private static File databaseLocation;
    private static EmbeddedGraphDatabase neo4jDB;

    /**
     * Returns the neo4j database
     * 
     * @return
     */
    public static EmbeddedGraphDatabase getNeo4jDatabase() {
        return neo4jDB;
    }

    @Bean
    public EmbeddedGraphDatabase graphDatabaseService() throws IOException {

        // TODO use properties so that the app does not use a temp dir
        databaseLocation = Files.createTempDirectory("neo4j").toFile();
        databaseLocation.deleteOnExit();

        neo4jDB = new EmbeddedGraphDatabase(databaseLocation.getAbsolutePath());
        return neo4jDB;
    }

    @Bean
    public Neo4jTemplate neo4jTemplate() throws IOException {
        return new Neo4jTemplate(graphDatabaseService());
    }

    @Bean
    public Neo4jMappingContext neo4jMappingContext() {
        return new Neo4jMappingContext();
    }

    @Bean
    public JtaTransactionManagerFactoryBean transactionManager() throws Exception {
        return new JtaTransactionManagerFactoryBean(graphDatabaseService());
    }

    @Bean
    public Neo4jExceptionTranslator exceptionTranslator() {
        return new Neo4jExceptionTranslator();
    }

}

每个 JerseyTest 测试用例都会重启 webapp。因此,neo4j 将始终使用一个空的 neo4j 数据库。

附加链接:

http://static.springsource.org/spring-data/neo4j/docs/2.2.2.RELEASE/reference/html/setup.html#d0e3653

于 2013-07-26T09:30:53.983 回答