2015-06-05 66 views
2

我正在使用arquillian来测试我的REST端点。以下是我们正在使用的示例终点和测试用例。使用jacoco进行REST调用的代码覆盖范围

REST端点

@Path("/v1/example") 
@Produces("application/json") 
@Consumes("application/json") 
public class HelloWorldResource { 

    @EJB 
    HelloWorldRemote helloWorldRemote; 

    @GET 
    @Path("/hello") 
    public Response getSayHello(){ 
     String helloText = helloWorldRemote.sayHello(); 
     final Response response = Response.ok(helloText).build(); 
     return response; 
    } 

    public String nonRESTSayHello(){ 
     return "SAY HELLO NONREST"; 
    } 
} 

TEST CASE:

@RunWith(Arquillian.class) 
@FixMethodOrder(MethodSorters.NAME_ASCENDING) 
public class HelloWorldResourceTest { 

    @Test 
    @OperateOnDeployment("REST") 
    public void testGetSayHello() { 
     System.out.println("testGETSAYHELLO!!!!!"); 

     Client client = ClientBuilder.newClient(); 
     Invocation.Builder builder = client.target(
       "http://localhost:8080/CoverageTest/api/v1/example/hello") 
       .request(MediaType.APPLICATION_JSON_TYPE); 
     javax.ws.rs.core.Response response = builder.get(); 
     assertEquals(200, response.getStatus()); 

    } 

    /* 
    * @Test 
    * public void testNonRESTSayHello(){ 
    *  HelloWorldResource hwr=new HelloWorldResource(); 
    *  String str = hwr.nonRESTSayHello(); 
    *  assertEquals("SAY HELLO NONREST",str); 
    * } 
    */ 

} 

我REST分离和NONREST元素成单独的拆封档案并将其部署到服务器和测试。问题是我没有获得REST端点的jacoco覆盖率。如果我取消注释testNonRESTSayHello(),它将显示该类的覆盖范围 - 仅针对方法:nonRESTSayHello(),尽管这两个方法都正在执行。不同之处在于其余端点通过Testcase的Invocation.Builder进行访问。

有什么想法?

回答

0

尽管在'黑匣子'测试时可以使用Jacoco实现覆盖测试(请参阅this page on how to use a java agent with tcp client/server),但我想知道为什么您应该这样做。我的意思是,以'黑盒'方式测试休息服务只是一种测试您使用的其他框架和代码的方法。在这种情况下,我通常使用mock并将其余服务作为普通方法进行测试,因为这样测试(在我看来)更容易阅读,维护和(最后但并非最不重要)运行更快。 编辑,添加一个例子:

@RunWith(Arquillian.class) 
public class HelloWorldResourceTest { 

    @EJB 
    HelloWorldResource helloService; 

    @Test 
    public void testGetSayHello() { 
     Response response = helloService.getSayHello(); 
     assertEquals(200, response.getStatus()); 
    } 

} 
+0

我已经尝试在jvm上挂钩jacocoagent,但似乎不工作。但我不知道如何用tcp client/server来完成。你能帮我解决这个问题吗? – Tomin

+0

也许[此主题](https://groups.google.com/forum/#!topic/jacoco/LlqoJpuacak)可以帮助你。 –

+0

你能帮我建立像http://www.eclemma.org/jacoco/trunk/doc/examples/java/ExecutionDataClient.java这样的客户端吗?我应该在哪里实现这段代码? – Tomin