SDN4 - neo4j 服务器插件的集成测试

SDN4 - Integration testing of neo4j server plugins

我正在尝试测试 server plugin from within a unit test. I've tried my best to set up the unit tests the same as this project

我的代码遇到的问题是由 PersistenceContext class 创建的 InProcessServer。 InProcessServer 从 7474 的第一个可用端口开始,因此对于我的测试,创建了几个 InProcessServers,我认为是因为新测试 运行 在上一个测试的端口关闭之前?

换句话说,在测试执行期间,我会在 localhost:7474、localhost:7475、localhost、7476 等上找到在我的浏览器中打开的进程服务器...

当然,这意味着在测试服务器插件时,在测试执行期间我不知道我要测试哪个端口,或者我要访问哪个数据库。如果我 运行 我的服务器插件集成单独测试它们 运行 没问题。

我的问题是:

1) 我一开始就理解了所有这些吗?

2) 如果我无法提前指定端口以及服务器插件 uri,如何将服务器插件作为更大集成测试的一部分进行测试?有没有一种干净的方法可以在 运行 时间找出当前用于测试的服务器端口?

InProcessServer 不公开单独的端口号,但它确实公开了完整的 url,其中包括端口号。这始终采用“http://localhost:xxxx”形式。如果您出于某种原因单独需要它,您可以很容易地从中提取端口号。

在使用服务器扩展进行测试时,此技巧可能会有用:

https://jira.spring.io/browse/DATAGRAPH-656?focusedCommentId=117218&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-117218

复制这里的建议:

要测试 Neo4jExtension,您需要创建自己的 TestServer 和 InProcessServer,以便连接扩展。是这样的: public Neo4jTestServer() {

    try {
        ServerControls controls = TestServerBuilders.newInProcessBuilder()
                .withExtension("/mypath", "org.mypackage")
                .withConfig("dbms.security.auth_enabled", "false")
                .newServer();

        initialise(controls); //Or try extracting the uri, port from controls this point

    } catch (Exception e) {
        throw new RuntimeException("Error starting in-process server",e);
    }

}

如果您想完全控制 InProcessServer 的配置,您自己动手并不难。这将完成工作:

public class MyInProcessServer implements Neo4jServer {

  private TestServer testServer;

  public InProcessServer(TestServer testServer)  {
    this.testServer = testServer;
  }

  public String url() {
    return this.testServer.url();
  }

  @Override
  public String username() {
    return "neo4j";
  }

  @Override
  public String password() {
    return "password";
  }

  public GraphDatabaseService database() {
    return testServer.getGraphDatabaseService();
  }
}

您显然需要相应地设置 Spring 配置:

@Bean
@Override
public Neo4jServer neo4jServer() {
    return new MyInProcessServer(new TestServer(6666));
}

未测试,但应该可以。