我为neo4j 2.3.0开发了一些非托管扩展。现在我想用junit测试我的代码的功能。有没有办法在没有在我的电脑上运行neo4j实例的情况下在本地测试我的方法?
我想要这样的事情: - 在执行测试之前创建neo4j的临时实例 - 用数据填充实例 - 通过休息呼叫我的分机 - 检查结果
我创建了一个Neo4JTestServer类(使用neo4j-harness):
public final class Neo4jTestServer {
public static final String EXTENSION_MOUNT_POINT = "/v1";
public static final String EXTENSION_RESOURCES = "my.company.neo4j.extension";
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)
.newServer();
}
public ServerControls getServerControls() {
return serverControls;
}
public void shutdown() {
serverControls.close();
}
}
我的测试类看起来像这样:
public class TestResource {
private Neo4jTestServer server;
@Before
public void prepare(){
this.server = Neo4jTestServer.getInstance();
}
@After
public void endup(){
// Shutdown server
this.server.shutdown();
}
@Test
public void test(){
//TODO fill neo4j with data
HTTP.Response response = HTTP.GET(this.server.getServerControls().httpURI().resolve("/v1/calculation/test").toString());
}
}
这是a link!在我使用的资源上。
我还检查了here的问题!但我不明白他们是否正在“真正的”neo4j实例上运行测试。
这只能在服务器上执行,还是有办法在本地运行这些测试?
编辑: 我总是得到500响应,调用其余的方法。
这是执行测试时的输出:
Nov 04, 2015 10:33:17 AM com.sun.jersey.api.core.PackagesResourceConfig init
INFORMATION: Scanning for root resource and provider classes in the packages:my.company.neo4j.extension
Nov 04, 2015 10:33:17 AM com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFORMATION: Root resource classes found: class my.company.neo4j.extension.Resource
Nov 04, 2015 10:33:17 AM com.sun.jersey.api.core.ScanningResourceConfig init
INFORMATION: No provider classes found.
Nov 04, 2015 10:33:17 AM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFORMATION: Initiating Jersey application, version 'Jersey: 1.19 02/11/2015 03:25 AM'
Nov 04, 2015 10:33:17 AM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFORMATION: Initiating Jersey application, version 'Jersey: 1.19 02/11/2015 03:25 AM'
Nov 04, 2015 10:33:17 AM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFORMATION: Initiating Jersey application, version 'Jersey: 1.19 02/11/2015 03:25 AM'
Nov 04, 2015 10:33:17 AM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFORMATION: Initiating Jersey application, version 'Jersey: 1.19 02/11/2015 03:25 AM'
这是“信息:找不到提供者类”。可能有问题吗?
编辑 - 这是我的扩展(仅用于测试)
@Path("/calculation")
public class ResourceV1 {
@Path("/test")
@GET
public Response test() throws Exception{
return Response.ok().build();
}
}
我还从临时数据库中找到了neo4j.log文件:
2015-11-04 11:52:39.876+0100 INFO [o.n.s.d.LifecycleManagingDatabase] Successfully started database
2015-11-04 11:52:39.896+0100 INFO [o.n.s.CommunityNeoServer] Starting HTTP on port 7474 (4 threads available)
2015-11-04 11:52:40.087+0100 INFO [o.n.s.m.ThirdPartyJAXRSModule] Mounted unmanaged extension [my.company.neo4j.extension] at [/v1]
2015-11-04 11:52:40.156+0100 INFO [o.n.s.w.Jetty9WebServer] Mounting static content at /webadmin
2015-11-04 11:52:40.233+0100 WARN [o.n.s.w.Jetty9WebServer] No static content available for Neo Server at port 7474, management console may not be available.
2015-11-04 11:52:40.252+0100 INFO [o.n.s.w.Jetty9WebServer] Mounting static content at /browser
2015-11-04 11:52:41.267+0100 INFO [o.n.s.CommunityNeoServer] Remote interface ready and available at http://localhost:7474/
答案 0 :(得分:2)
你正在尝试的是遵循
- Neo4JTestServer类是内存中Neo4j服务器的工厂。它与“真实”基本相同。
- TestResource类是扩展的简单测试。
问题可能是如何将扩展加载到测试中。您的扩展名是否包名为“my.company.neo4j.extension”?
您能否告诉我们您的分机号码?
我的建议如下
- 阅读http://neo4j.com/docs/stable/server-unmanaged-extensions-testing.html
- 查看GraphUnit,它提供了更好的测试扩展程序的可能性 - https://github.com/graphaware/neo4j-framework/tree/master/tests
答案 1 :(得分:0)
设置新项目后,我找到了解决问题的方法。在我的maven依赖项中,我有两个
<dependency>
<groupId>org.neo4j.test</groupId>
<artifactId>neo4j-harness</artifactId>
<version>${neo4j.version}</version>
<scope>test</scope>
</dependency>
和
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
在我的情况下,这是问题 - 在删除javax ws的依赖关系后,testcase成功了,我可以调用其余的方法。
编辑:删除jax rs依赖项后,由于缺少依赖项,我无法构建扩展。
我的解决方案:添加以下依赖项而不是javax.ws.rs-api。
<dependency>
<groupId>org.neo4j.3rdparty.javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<scope>provided</scope>
<version>1.1.2.r612</version>
</dependency>
似乎neo4j-harness工作得很好。