Java 为什么Jacoco报告';它是通过测试执行的?

Java 为什么Jacoco报告';它是通过测试执行的?,java,maven,sonarqube,cobertura,jacoco,Java,Maven,Sonarqube,Cobertura,Jacoco,给定Sample.java,一个测试类Sample_UT.java,SonarQube 3.7.3,为什么Jacoco报告Sample.java的覆盖率为0%,而Cobertura报告的覆盖率为100%?行返回新的RawResponse(builder.delete(String.class,requestBody))执行得很清楚,但Jacoco报告说没有执行。我的jacoco和cobertura maven配置文件如下所示。Jacoco正在报告同一包中的另一个类的100% Sample.jav

给定Sample.java,一个测试类Sample_UT.java,SonarQube 3.7.3,为什么Jacoco报告Sample.java的覆盖率为0%,而Cobertura报告的覆盖率为100%?行
返回新的RawResponse(builder.delete(String.class,requestBody))执行得很清楚,但Jacoco报告说没有执行。我的jacoco和cobertura maven配置文件如下所示。Jacoco正在报告同一包中的另一个类的100%

Sample.java:

package com.example;

import com.sun.jersey.api.client.WebResource;

public class Sample {

    protected RawResponse issueQuery(WebResource.Builder builder, DataTransferObject requestBody) {
        return new RawResponse(builder.delete(String.class, requestBody));
    }
}
示例_UT.java:

package com.example;

import com.sun.jersey.api.client.WebResource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;

@RunWith(PowerMockRunner.class)
@PrepareForTest({Sample.class, WebResource.Builder.class})
public class Sample_UT {

    @Mock
    private WebResource.Builder mockBuilder;
    @Mock
    private WebResource mockWebResource;
    @Mock
    private DataTransferObject mockTestRequestBody;

    private String testResponseBody = "response";

    @InjectMocks
    private Sample subject;

    @Test
    public void testThat_IssueQuery_ReturnsRawResponse_FromBuilder() throws Exception {
        when(mockBuilder.delete(String.class, mockTestRequestBody)).thenReturn(testResponseBody);
        assertEquals(testResponseBody, subject.issueQuery(mockBuilder, mockTestRequestBody).getBody());
    }
}
settings.xml中的代码段:

<profile>
    <id>jacoco</id>
    <properties>
        <sonar.branch>JAC</sonar.branch>
        <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
        <sonar.jacoco.reportPath>target/jacoco.report</sonar.jacoco.reportPath>
        <sonar.dynamicAnalysis>true</sonar.dynamicAnalysis>
        <sonar.junit.reportsPath>target/surefire-reports</sonar.junit.reportsPath>
        <forceAnaylysis>true</forceAnaylysis>
    </properties>
</profile>

<profile>
    <id>cobertura</id>
    <properties>
        <sonar.branch>COB</sonar.branch>
        <sonar.java.coveragePlugin>cobertura</sonar.java.coveragePlugin>
        <sonar.dynamicAnalysis>true</sonar.dynamicAnalysis>
        <sonar.junit.reportsPath>target/surefire-reports</sonar.junit.reportsPath>
        <forceAnaylysis>true</forceAnaylysis>
    </properties>
</profile>

杰科科
江淮
杰科科
target/jacoco.report
真的
目标/surefire报告
真的
科贝图拉
圆面包
科贝图拉
真的
目标/surefire报告
真的

这可能只是Jacoco的一个bug,它无法很好地监视返回语句。如果Cobertura更准确,那么就用这个。总的来说,我同意。我想等待,一旦早期采用者清除了基本的bug,我就会转而使用Jacoco。然而,我们需要Java 1.7,而Cobertura也有它自己的问题,其中-XX:-UseSplitVerifier似乎没有为我们解决。然而,它似乎与return语句没有问题-如果我在返回之前抛出一个println,那么Jacoco会报告已覆盖的返回,而不是println。因此,在本例中,它似乎没有正确地报告方法的第一行。我得到了-XX:-UseSplitVerifier,它为cobertura工作,所以我现在将继续使用它。