我有自己的自定义编写的Neo4j数据库非托管扩展。
我想在全功能数据库中运行集成测试,并在那里提供非托管扩展。
答案 0 :(得分:3)
Neo4j提供了一个名为neo4j-harness
的工具,可以更轻松地为非管理扩展编写集成测试。更多的iformation是available here。
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资源提示:您可以在所有资源所在的同一个包中创建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测试框架测试非托管扩展的更详细说明。
现在一切都应该正常运行并准备好进行测试。祝你好运!