【问题标题】:Testing Neo4j managed extensions测试 Neo4j 托管扩展
【发布时间】:2015-01-26 18:46:32
【问题描述】:

我已经按照http://neo4j.com/docs/stable/server-plugins.html 的指南为 Neo4j 编写了一个服务器扩展。我为一些内部方法编写了单元测试,但如果可能的话,我也想测试一下 REST 接口。

http://neo4j.com/docs/stable/_testing_your_extension.html 似乎只展示了如何测试非托管扩展,但我正在寻找与托管扩展非常相似的东西。有什么指点吗?

我确实知道如何将扩展加载到服务器并使用curl 查询它(如下所示),但是当出现问题时,这不是一个有趣的调试周期。

curl -X POST -v http://localhost:7474/db/data/ext/NeoPlugin/graphdb/myExt \
  -H "Content-Type: application/json" \
  -d '{"argFoo": "ACTED_IN", "argBar": ["0", "10"]}'

更新: 我遇到的主要(或只是第一个?)部分是启动一个包含我的托管扩展的轻量级测试 REST 服务器。我认为一旦有了服务器,我可以使用各种策略查询它并检查结果。

【问题讨论】:

    标签: rest testing junit neo4j


    【解决方案1】:

    如果我错了,请纠正我,但这听起来像是一个关于测试 RESTful API 的更普遍的问题。

    由于您已经标记了 junit,您可能需要考虑类似 restfuse 之类的东西,它是 JUnit 的 RESTful API 测试扩展。如果您已经在使用 neo4j 提供的工具测试您的非托管扩展,那么这可能是最合适的。

    RESTful 测试可能如下所示:

    @RunWith( HttpJUnitRunner.class )
    public class RestfuseTest {
      @Rule
      public Destination destination = new Destination( "http://localhost:7474/db/data/ext/NeoPlugin/graphdb/myExt" ); 
    
      @Context
      private Response response; // will be injected after every request
    
      @HttpTest( method = Method.GET, path = "/" )
      public void checkRestfuseOnlineStatus() {
        assertOk( response );
      }  
    }
    

    对于更多的“零售”测试而不是“批发”程序化测试,我倾向于使用 Chrome 上的 Postman 扩展,这使得制作请求和检查结果变得非常容易(想想更简单的 curl 界面,你就是现在使用)。

    最后,FWIW 提供了用于测试 RESTful API 的其他方法的大量选项。选择您最喜欢的技术或堆栈,无论是 frisby on javascript 还是 vREST

    【讨论】:

    • 我将编辑我的问题 - 我认为这里的主要问题不是通过测试查询访问 REST 服务器,而是首先弄清楚如何启动测试 REST 服务器。 Neo2j 似乎有一些非托管扩展的特殊助手,但我无法弄清楚托管。
    【解决方案2】:

    它在文档中有点隐藏,要么使用 ServerBuilder(位于 org.neo4j.app:neo4j-server:test-jar)启动 CommunityNeoServer,要么使用此处记录的新测试工具:http://neo4j.com/docs/stable/_testing_your_extension.html

    <dependency>
       <groupId>org.neo4j.test</groupId>
       <artifactId>neo4j-harness</artifactId>
       <version>${neo4j.version}</version>
       <scope>provided</scope>
    </dependency>
    

    测试工具包提供了一种机制来启动具有自定义配置和您选择的扩展的 Neo4j 实例。它还提供了在启动 Neo4j 时指定要包含的数据固定装置的机制。

    使用示例。

    @Path("")
    public static class MyUnmanagedExtension
    {
        @GET
        public Response myEndpoint()
        {
            return Response.ok().build();
        }
    }
    
    @Test
    public void testMyExtension() throws Exception
    {
        // Given
        try ( ServerControls server = TestServerBuilders.newInProcessBuilder()
                .withExtension( "/myExtension", MyUnmanagedExtension.class )
                .newServer() )
        {
            // When
            HTTP.Response response = HTTP.GET( server.httpURI().resolve( "myExtension" ).toString() );
    
            // Then
            assertEquals( 200, response.status() );
        }
    }
    

    【讨论】:

    • 是的,这与我在最初的问题中链接到的文档相同,但我仍然不理解托管扩展。 =(我可以很好地运行您的示例并且它成功了,但是当我用我的 NeoPlugin.class 托管扩展替换 MyUnmanagedException.class 并摆脱 MyUnmanagedExtension 定义时,newServer() 调用失败,说 "com.sun.jersey.api.container.ContainerException: The ResourceConfig instance does not contain any root resource classes."
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多