3

我在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据我所知,我无法从那里提取任何类型的东西。

4

2 回答 2

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

于 2016-06-05T09:16:39.850 回答
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);
    }
}

正如JavadocServerSocket解释的:

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

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

等等瞧!

于 2017-04-02T15:44:36.313 回答