para examples conectar con and java unit-testing neo4j neo4j-bolt

java - examples - Neo4j: unidad de prueba del controlador del perno correctamente



neo4j v1 examples (2)

El Neo4j JDBC tiene una clase llamada Neo4jBoltRule para pruebas unitarias. Es una regla junit que inicia / detiene una base de datos no permanente junto con alguna configuración para comenzar a atornillar.

La clase de regla utiliza la asignación dinámica de puertos para evitar errores de prueba debido a la ejecución de múltiples pruebas en paralelo (piense en su infraestructura de CI).

Un ejemplo de una prueba de unidad que usa esa clase de regla está disponible en https://github.com/neo4j-contrib/neo4j-jdbc/blob/master/neo4j-jdbc-bolt/src/test/java/org/neo4j/jdbc /bolt/SampleIT.java

Estoy agregando el controlador Neo4j Bolt a mi aplicación solo siguiendo el http://neo4j.com/developer/java/ :

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();

Sin embargo, siempre desde la documentación oficial , la unidad de prueba se hace usando:

GraphDatabaseService db = new TestGraphDatabaseFactory() .newImpermanentDatabaseBuilder()

Entonces, si quiero probar de alguna manera el código anterior, tengo que reemplazar GraphDatabase.driver( "bolt://localhost",...) con GraphDatabaseService de la prueba. ¿Cómo puedo hacer eso? No puedo extraer ningún tipo de in-memory driver desde allí hasta donde puedo ver.


Una manera fácil ahora es sacar neo4j-harness y usar su Neo4jRule siguiente manera:

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

Donde la implementación de findFreePort puede ser tan simple como:

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

Como explica el Javadoc de ServerSocket :

Un número de puerto de 0 significa que el número de puerto se asigna automáticamente, generalmente desde un rango de puerto efímero. Este número de puerto se puede recuperar llamando a getLocalPort.

Además, el socket se cierra antes de que se devuelva el valor del puerto, por lo que hay grandes posibilidades de que el puerto devuelto esté disponible en el momento de la devolución (la ventana de oportunidad para que el puerto se vuelva a asignar entre ellas es pequeña; el cálculo del tamaño de la ventana) se deja como un ejercicio para el lector).

Et voilà!