如何使用boot 2.0和Neo4j SDN5在弹簧单元测试中配置自己的GraphDatabaseService和GraphAwareRuntime

时间:2017-10-13 03:35:36

标签: java neo4j spring-data spring-data-neo4j-4 graphaware

我正在编写一些单元测试,并希望将TimeTree与Spring存储库一起使用,以将事件节点自动附加到时间树。像this这样的问题,但我使用的是boot 2.0和SDN5。我认为我的主要问题是我不知道如何设置配置,因此我的存储库和我的TimeTree使用相同的GraphDatabaseService。我的@Confuration是这样的:

    @Configuration
    public class SpringConfig {

        @Bean
        public SessionFactory sessionFactory() {
            // with domain entity base package(s)
            return new SessionFactory(configuration(), "org.neo4j.boot.test.domain");
        }

        @Bean
        public org.neo4j.ogm.config.Configuration configuration() {
            return new org.neo4j.ogm.config.Configuration.Builder()
                .uri("bolt://localhost")
                .build();
        }

        @Bean
        public Session getSession() {
            return sessionFactory().openSession();
        }

        @Bean
        public GraphDatabaseService graphDatabaseService() {
            return new GraphDatabaseFactory()
                .newEmbeddedDatabase(new File("/tmp/graphDb"));
        }

        @Bean
        public GraphAwareRuntime graphAwareRuntime() {
            GraphDatabaseService graphDatabaseService = graphDatabaseService();
            GraphAwareRuntime runtime = GraphAwareRuntimeFactory
                .createRuntime(graphDatabaseService);

            runtime.registerModule(new TimeTreeModule("timetree",
                TimeTreeConfiguration
                    .defaultConfiguration()
                    .withAutoAttach(true)
                    .with(new NodeInclusionPolicy() {
                        @Override
                        public Iterable<Node> getAll(GraphDatabaseService graphDatabaseService) {
                            return null;
                        }

                        @Override
                        public boolean include(Node node) {
                            return node.hasLabel(Label.label("User"));
                        }
                    })
                    .withRelationshipType(RelationshipType.withName("CREATED_ON"))
                    .withTimeZone(DateTimeZone.forTimeZone(TimeZone.getTimeZone("GMT+1")))
                    .withTimestampProperty("createdOn")
                    .withResolution(Resolution.DAY)
    //                      .withCustomTimeTreeRootProperty("timeTreeName")
                    .withResolution(Resolution.HOUR), graphDatabaseService));
            runtime.start();
            return runtime;
        }
    }

我的测试看起来像这样:

    User user = new User("Michal");
    user.setCreatedOn(1431937636995l);
    userRepository.save(user);

    GraphUnit.assertSameGraph(graphDb, "CREATE (u:User {name:'Michal', createdOn:1431937636995})," +
            "(root:TimeTreeRoot)," +
            "(root)-[:FIRST]->(year:Year {value:2015})," +
            "(root)-[:CHILD]->(year)," +
            "(root)-[:LAST]->(year)," +
            "(year)-[:FIRST]->(month:Month {value:5})," +
            "(year)-[:CHILD]->(month)," +
            "(year)-[:LAST]->(month)," +
            "(month)-[:FIRST]->(day:Day {value:18})," +
            "(month)-[:CHILD]->(day)," +
            "(month)-[:LAST]->(day)," +
            "(day)<-[:CREATED_ON]-(u)"
    );

    GraphUnit.printGraph(graphDb);
    graphDb.shutdown();

有很多错误,但我认为它们都来自于这一点:

Bean instantiation via factory method failed; nested exception is
org.springframework.beans.BeanInstantiationException: Failed to 
instantiate [org.springframework.data.repository.support.Repositories]: 
Factory method 'repositories' threw exception; nested exception is 
org.springframework.beans.factory.UnsatisfiedDependencyException: Error 
creating bean with name 'userRepository': Unsatisfied dependency 
expressed through method 'setSession' parameter 0; nested exception is 
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No 
qualifying bean of type 'org.neo4j.ogm.session.Session' available: 
expected single matching bean but found 2: getSession,
org.springframework.data.neo4j.transaction.SharedSessionCreator#0

1 个答案:

答案 0 :(得分:1)

这是因为配置类重新定义了一些已经由Spring启动自动配置的bean(这里是getSession())。

所以弹簧注射不知道如何选择2。 删除SessionFactory应该有帮助。

第二件事是graphDatabaseService()必须使用@Bean public SessionFactory sessionFactory() { EmbeddedDriver driver = new EmbeddedDriver(graphDatabaseService()); return new SessionFactory(driver, "org.neo4j.boot.test.domain"); } @Bean public PlatformTransactionManager transactionManager() { return new Neo4jTransactionManager(sessionFactory()); } @Bean public GraphDatabaseService graphDatabaseService() { return new TestGraphDatabaseFactory().newImpermanentDatabaseBuilder().newGraphDatabase(); } @Bean public GraphAwareRuntime graphAwareRuntime() { ... 方法中的嵌入式数据库设置。为此,请使用现有数据库配置嵌入式驱动程序。

应该适合您的摘要配置:

Traceback (most recent call last):
  File "/Users/Home/Downloads/JSONtoCSV/testflattening.py", line 32, in <module>
    print json_normalize(data, 'items', [['address','city'], ['address','company_name'], 'number'])
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/io/json/normalize.py", line 262, in json_normalize
    'need distinguishing prefix ' % k)
ValueError: Conflicting metadata name number, need distinguishing prefix