Neo4j:正确测试螺栓驱动器

时间:2016-06-04 08:52:11

标签: java unit-testing neo4j neo4j-bolt

我正在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();

但是,总是从官方documentation单元测试使用:

GraphDatabaseService db = new TestGraphDatabaseFactory()
            .newImpermanentDatabaseBuilder()

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

2 个答案:

答案 0 :(得分:2)

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

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

https://github.com/neo4j-contrib/neo4j-jdbc/blob/master/neo4j-jdbc-bolt/src/test/java/org/neo4j/jdbc/bolt/SampleIT.java

提供了使用该规则类的单元测试示例

答案 1 :(得分:1)

现在,一种简单的方法是提取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的{​​{3}}解释:

  

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

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

Etvoilà!