簡體   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