如何使用自定义非托管扩展对Neo4j运行测试?

时间:2015-09-14 14:31:15

标签: java neo4j

我有自己的自定义编写的Neo4j数据库非托管扩展。

我想在全功能数据库中运行集成测试,并在那里提供非托管扩展。

1 个答案:

答案 0 :(得分:3)

Neo4j提供了一个名为neo4j-harness的工具,可以更轻松地为非管理扩展编写集成测试。更多的iformation是available here

Blog post

1)确定需要(使用过)的Neo4j版本。

的Maven:

<properties>
    <version.neo4j>2.2.5</version.neo4j>
</properties>

2)为neo4j-harness添加依赖项。

的Maven:

<dependency>
    <groupId>org.neo4j.test</groupId>
    <artifactId>neo4j-harness</artifactId>
    <version>${version.neo4j}</version>
    <!-- If you want to use Neo4j server in sources, instead of tests, then remove this line -->
    <scope>test</scope> 
</dependency>

3)确保您在测试中可以使用非托管扩展源。

的Maven:
如果您将测试写入带有扩展名的同一模块中,那么一切正常 如果你在单独的模块中编写测试(即integration-tests),那么请确保该扩展可用。

<dependency>
    <groupId>my.company</groupId>
    <artifactId>unmanaged-extension</artifactId>
    <version>${project.version}</version>
    <scope>test</scope> 
</dependency>    

4)创建负责数据库启动和关闭的Neo4jTestServer类。

/**
 * Spin-up Neo4j server with loaded unmanaged extension.
 */
public final class Neo4jTestServer {

    public static final String EXTENSION_MOUNT_POINT = "/ext";
    public static final String EXTENSION_RESOURCES = "my.company.extension.resources";
    // Alternative way to get package
    // public static final String EXTENSION_RESOURCES = SomeResource.class.getPackage().getName();

    private static Neo4jTestServer INSTANCE = null;

    public static synchronized Neo4jTestServer getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new Neo4jTestServer();
        }
        return INSTANCE;
    }

    private final ServerControls serverControls;

    private Neo4jTestServer() {
        serverControls = TestServerBuilders.newInProcessBuilder()
            .withExtension(EXTENSION_MOUNT_POINT, EXTENSION_RESOURCES)
            // Resource can be specified directly
            // .withExtension(EXTENSION_MOUNT_POINT, SomeResource.class)
            .newServer();
    }

    public ServerControls getServerControls() {
        return serverControls;
    }

    public void shutdown() {
        serverControls.close();
    }
}

用法:

Neo4jTestServer server = Neo4jTestServer.getInstance();
// Get Neo4j server URI, with port
server.getServerControls().getHttpUri();
// Shutdown server
server.shutdown();

注意:

  • SomeResource是提供自定义功能的JAX-RS资源
  • 如果您有多个资源,并且想要使用类来指定非托管扩展,而不是字符串 - 则无需指定所有的类。 Neo4j将扫描指定的类包以获取其他资源并自动加载它们。
  • 所有资源都应该在同一个包中

提示:您可以在所有资源所在的同一个包中创建ResourcesRootPackageMarker类,并使用此类来指定包。它使代码对未来的代码重构更具弹性。

5)可选。指定JVM关闭挂钩以关闭数据库。

final Neo4jTestServer server = Neo4jTestServer.getInstance();
Runtime.getRuntime().addShutdownHook(new Thread() {
    @Override
    public void run() {
        server.shutdown();
    }
});

6)要验证一切正常并且您的非托管扩展可用 - 执行测试,启动数据库并检查Neo4j服务器生成的输出。

你应该看到这样的事情:

INFO: Scanning for root resource and provider classes in the packages:
  my.company.extension.resources
Sep 14, 2015 5:25:15 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFO: Root resource classes found:
  class my.company.extension.resources.SomeResource
  class my.company.extension.resources.AnotherResource

编辑: Graphaware测试框架,MicTech提供的信息

或者,GraphAware Test提供了graphaware框架,可以测试任何与Neo4j相关的代码。

  

该模块提供了轻松测试以某种方式与Neo4j数据库通信的代码的方法。该模块的目标读者是编写与Neo4j相关的代码的Java开发人员,以及GraphAware模块和API的作者。

Here你可以找到一些关于如何使用框架的帖子(由Graphaware开发人员编写)。

基本上你需要做的是:

1)创建扩展名:

@Path("/helloworld")
public class HelloWorldUnmanagedExtension {

    private final HelloWorldNodeCreator nodeCreator;

    public HelloWorldUnmanagedExtension(@Context GraphDatabaseService database) {
        nodeCreator = new HelloWorldNodeCreator(database);
    }

    @POST
    @Path("/create")
    public Response createHelloWorldNode() {
        Node node = nodeCreator.createHelloWorldNode();
        return Response.ok(String.valueOf(node.getId())).build();
    }
}

2)使用WrappingServerIntegrationTest和必要的配置扩展您的测试。

public class HelloWorldUnmanagedExtensionApiTest extends WrappingServerIntegrationTest {

    @Override
    protected Map<String, String> thirdPartyJaxRsPackageMappings() {
        return Collections.singletonMap("com.graphaware.example.unmanaged", "/ext");
    }

    @Test
    public void shouldCreateAndReturnNode() {
        String result = TestUtils.post(baseNeoUrl() + "/ext/helloworld/create", 200);
        assertEquals("0", result);

        GraphUnit.assertSameGraph(getDatabase(), "CREATE (:HelloWorld {hello:'world'})");
    }
}

Here可以找到有关如何使用Graphaware测试框架测试非托管扩展的更详细说明。

现在一切都应该正常运行并准备好进行测试。祝你好运!