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

2024-02-13

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

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


Neo4j 提供了名为neo4j-harness这使得为​​非托管扩展编写集成测试变得更加容易。更多信息是可以在这里找到 http://neo4j.com/docs/stable/server-unmanaged-extensions-testing.html.


博客文章 http://vrublevsky.me/neo4j/java/how-to-run-tests-against-neo4j-database-with-unmanaged-extension.html

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

Usage:

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

Notes:

  • SomeResource是提供自定义功能的 JAX-RS 资源
  • 如果您有超过 1 个资源,并且想要使用类来指定非托管扩展,而不是字符串 - 则无需指定所有这些类。 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

EDIT:Graphaware测试框架,信息提供者MicTech https://stackoverflow.com/users/69684/mictech

或者,有图形感知测试 https://github.com/graphaware/neo4j-framework/tree/master/tests框架提供者图形意识 http://graphaware.com/,这使得测试任何 Neo4j 相关代码成为可能。

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

Here http://graphaware.com/blog/testing/您可以找到一些关于如何使用框架的帖子(由 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 https://github.com/graphaware/neo4j-framework/tree/master/tests#unmanaged-extension可以找到有关如何使用 Graphaware 测试框架测试非托管扩展的更详细说明。


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用自定义非托管扩展对 Neo4j 运行测试? 的相关文章

随机推荐

  • Application.LoadComponent 出现线程错误(键已存在)

    MSDN 说 System Windows Application 的公共静态成员是线程安全的 但是当我尝试使用多个线程运行我的应用程序时 出现以下异常 ArgumentException An entry with the same ke
  • Scala - 辅助构造函数总是必须调用另一个构造函数有什么好处?

    来自 Java 世界 我不明白 Scala 中对辅助构造函数的限制有什么帮助 在Java中 我知道我们可以有多个构造函数 只要它们的签名不同 在 Scala 中 辅助构造函数中的第一个调用必须是另一个辅助构造函数或类的主构造函数 为什么 这
  • 如何在Lua中给定日期时间添加天数

    我是 Lua 脚本的新手 我的系统在任何时区运行 但我需要格林威治标准时区的新日期和格林威治标准时间的给定日期 local creation date 2016 05 23 07 34 19 This is in GMT date loca
  • 重写子类中的 ReadOnly 属性以使其读/写(VB.NET 或 C#)

    这在带有属性的 VB NET 中似乎不可能 因为属性语句本身必须描述它是否是ReadOnly or not 在我下面的例子中 它不允许我做ReadWriteChild编译 我想我可以让父级读 写 然后让 ReadOnlyChild 的设置器
  • 更新 COSU 设备中的 Android 应用程序

    我正在从事应用程序支持工作COSU 应用程序 Android https developer android com work cosu html 该应用程序对我来说运行良好 但我不明白用户将如何更新我们的应用程序 因为 COSU 应用程序
  • PowerShell 区分大小写变量

    我想编写一个脚本来对我公司的用户进行操作 用户名可以是大写字母 小写字母 而且域名有时也会用大写字母分配给他们 所以用户名可以是这样的 域 用户名 域 用户名 域 用户名或域 用户名 我要求这样的用户名 user Read Host Ple
  • 收到“由以下原因引起:java.lang.VerifyError:”

    我创建了一个 Android 应用程序 它在另一个 Android 应用程序中用作库 我在 android 应用程序中使用了一些第三方 jar 来充当库 当我在我的 android 应用程序中链接这个库并运行它时 当它尝试访问库中存在的类时
  • git 没有这样的文件或目录

    我正在构建一个应用程序 并且一如既往地使用 Git 进行版本控制 以下是输入和输出 希望您能帮助我 git status On branch master Untracked files use git add
  • 不通过使用 CSS 更改 Gridview 中的标题文本颜色

    我正在使用 asp net c 我正在使用 gridview 来显示数据 我通过 CSS 控制所有格式 在 gridview 中 我定义了 itemtemplate edititemtemplate footertemplate 并通过模板
  • 如何配置 Simple Framework 以要求 SSL 客户端身份验证?

    我正在使用以下方式编写 HTTP 服务器简单的框架 http www simpleframework org 并希望要求客户提供由我的证书颁发机构签名的有效证书才能建立连接 我编写了以下基本服务器 如何修改此代码以要求对所有 SSL 连接进
  • IList 和 IReadOnlyList

    如果我有一个方法需要一个参数 Has a Count财产 有一个整数索引器 仅获取 这个参数的类型应该是什么 我会选IList
  • 表单作为 GET Laravel 4 提交

    我有这样的形式
  • AES 中的初始化向量长度

    我将 AES 与 AES CBC PKCS5Padding 结合使用 并在 Android 中使用以下加密和解密代码部分 cipher init Cipher ENCRYPT MODE keySpec new IvParameterSpec
  • 在失败的任务上继续 Azure Pipeline

    我有一个运行 Cypress 的任务 ErrorAction SilentlyContinue cd System DefaultWorkingDirectory ClientWeb Build CI ShellArtifact npx c
  • 如何从 5 个表中选择多个值?

    我想选择 PROJECT ID STAFF ID HARDWARE ID 和 SOFTWARE ID 它们都链接在表 ASSIGNMENTS 中 但我想显示该链接 同时还显示链接到相关 ID 的每个相应表中的所有属性 例如 STAFF NA
  • Angular 2 http 未设置标头

    我正在设置我的标头和 http 调用 如下所示 var headers new Headers headers set Authorization Bearer xxxxxxxxxxx this http get http localhos
  • Prerender.io 子页面重定向到索引

    我遵循以下指南 以角度表示 locationProvider html5Mode true 在 html 中 添加此元标头 配置阿帕奇 RewriteEngine On If requested resource exists as a f
  • 使用 Laravel 发送 Base64 图像

    我正在使用 Laravel 发送电子邮件 纯文本工作正常 但是 我在将图像附加到电子邮件时遇到问题 截至目前 图像作为 Base64 字符串存储在数据库中 这是在 Laravel 中调用 Mail 外观的代码 Mail queue emai
  • LinearSVC sklearn (scikit-learn) 中 C 的行为

    首先我创建一些玩具数据 n samples 20 X np concatenate np random normal loc 2 scale 1 0 size n samples np random normal loc 20 0 scal
  • 如何使用自定义非托管扩展对 Neo4j 运行测试?

    我有自己为 Neo4j 数据库定制编写的非托管扩展 我想针对功能齐全的数据库运行集成测试 并在那里提供非托管扩展 Neo4j 提供了名为neo4j harness这使得为 非托管扩展编写集成测试变得更加容易 更多信息是可以在这里找到 htt