Neo4j:正确测试螺栓驱动器

我正在按照http://neo4j.com/developer/java/将Neo4j Bolt驱动程序添加到我的应用程序中:

import org.neo4j.driver.v1.*; Driver driver = GraphDatabase.driver( "bolt://localhost", AuthTokens.basic( "neo4j", "neo4j" ) ); Session session = driver.session(); session.run( "CREATE (a:Person {name:'Arthur', title:'King'})" ); StatementResult result = session.run( "MATCH (a:Person) WHERE a.name = 'Arthur' RETURN a.name AS name, a.title AS title" ); while ( result.hasNext() ) { Record record = result.next(); System.out.println( record.get( "title" ).asString() + " " + record.get("name").asString() ); } session.close(); driver.close(); 

但是,总是从官方文档unit testing使用:

 GraphDatabaseService db = new TestGraphDatabaseFactory() .newImpermanentDatabaseBuilder() 

因此,如果我想以某种方式测试上面的代码,我必须用测试中的GraphDatabase.driver( "bolt://localhost",...)替换GraphDatabase.driver( "bolt://localhost",...) 。 我怎样才能做到这一点? 据我所知,我无法从那里提取任何类型的in-memory driver

Neo4j JDBC有一个名为Neo4jBoltRule的类用于unit testing。 这是启动/停止非永久性数据库的junit规则以及启动bolt的一些配置。

规则类使用动态端口分配来防止由于并行运行多个测试而导致测试失败(请考虑您的CI基础结构)。

有关使用该规则类的unit testing的示例,请访问https://github.com/neo4j-contrib/neo4j-jdbc/blob/master/neo4j-jdbc-bolt/src/test/java/org/neo4j/jdbc /bolt/SampleIT.java

现在一个简单的方法是拉出neo4j-harness ,并使用他们内置的Neo4jRule ,如下所示:

 import static org.neo4j.graphdb.factory.GraphDatabaseSettings.boltConnector; // [...] @Rule public Neo4jRule graphDb = new Neo4jRule() .withConfig(boltConnector("0").address, "localhost:" + findFreePort()); 

findFreePort实现可以如下所示:

 private static int findFreePort() { try (ServerSocket socket = new ServerSocket(0)) { return socket.getLocalPort(); } catch (IOException e) { throw new RuntimeException(e.getMessage(), e); } } 

正如ServerSocket的Javadoc解释:

端口号为0表示通常从临时端口范围自动分配端口号。 然后可以通过调用getLocalPort来检索此端口号。

此外,套接字在返回端口值之前关闭,因此返回的端口很有可能在返回时仍然可用(在两者之间再次分配端口的机会窗口很小 – 窗口大小的计算留给读者的练习)。

Etvoilà!