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”形式。如果您出于某种原因单独需要它,您可以很容易地从中提取端口号。
在使用服务器扩展进行测试时,此技巧可能会有用:
复制这里的建议:
要测试 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));
}
未测试,但应该可以。
我正在尝试测试 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”形式。如果您出于某种原因单独需要它,您可以很容易地从中提取端口号。
在使用服务器扩展进行测试时,此技巧可能会有用:
复制这里的建议:
要测试 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));
}
未测试,但应该可以。