繁体   English   中英

Neo4j:正确测试螺栓驱动器

[英]Neo4j: unit testing the bolt driver properly

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

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

GraphDatabaseService db = new TestGraphDatabaseFactory()
            .newImpermanentDatabaseBuilder()

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

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

现在一个简单的方法是拉出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);
    }
}

正如ServerSocketJavadoc解释:

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

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

Etvoilà!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM