Jacoco未检测到接口

时间:2018-12-07 07:38:45

标签: java spring-boot junit spring-data-jpa jacoco

我已经配置了Jacoco,以便在运行单元测试时生成覆盖报告。

<plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.8.2</version>
            <executions>
                <execution>
                    <id>unit-test-prepare-agent</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                    <configuration>
                        <propertyName>surefireArgLine</propertyName>
                        <destFile>${jacoco.report.directory}/jacoco-ut.exec</destFile>
                    </configuration>
                </execution>
                <execution>
                    <id>unit-test-report</id>
                    <phase>test</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                    <configuration>
                        <dataFile>${jacoco.report.directory}/jacoco-ut.exec</dataFile>
                        <outputDirectory>${jacoco.report.directory}/jacoco-ut</outputDirectory>
                    </configuration>
                </execution>
    </executions>
</plugin>

但是由于某种原因,它跳过了项目的dao程序包,该程序包包含Spring Data Jpa存储库接口。

例如,以下界面:

import com.shaunyl.website.dao;

public interface ProductRepository extends JpaRepository<Product, Long>, JpaSpecificationExecutor<Product> {

    @Query(value = "SELECT p FROM Product p",
            countQuery = "SELECT COUNT(p) FROM Product p")
    Page<Product> findAll(Pageable pageable);
}

具有以下测试:

@RunWith(SpringRunner.class)
@DataJpaTest
public class ProductRepositoryTests {

    private static final int INVENTORY_SIZE = 5;

    @Autowired
    ProductRepository productRepository;

    private Category[] categories;

    private List<Product> inventory;

    @Before
    public void setUp() {
        inventory = productRepository.saveAll(products(INVENTORY_SIZE));
        categories = inventory.stream().map(Product::getCategory).toArray(Category[]::new);
    }

@Test
public void shouldRetrieveOnePageOfProducts() {
    // given
    int PAGE = 0;
    int SIZE = 20;
    Pageable pageable = newUnsortedPage(PAGE, SIZE);

    // when
    Page<Product> products = productRepository.findAll(pageable);

    // then
    assertThat(products.getNumber()).isEqualTo(PAGE);
    assertThat(products.getNumberOfElements()).isEqualTo(INVENTORY_SIZE);
    assertThat(products)
            .as("categories are eagerly fetched")
            .extracting(Product::getCategory)
            .containsExactlyInAnyOrder(categories);
 }
}

但是在Jacoco报告中,dao包被跳过。 我相信是因为目标类是接口,但我不确定。

您知道可能是什么问题,以及如何解决该问题?

1 个答案:

答案 0 :(得分:0)

JaCoCo测量可执行Java代码。在您的界面中

public interface ProductRepository extends JpaRepository<Product, Long>, JpaSpecificationExecutor<Product> {

    @Query(value = "SELECT p FROM Product p",
            countQuery = "SELECT COUNT(p) FROM Product p")
    Page<Product> findAll(Pageable pageable);
}

没有可执行的Java代码,只有使用常量的方法声明和注释。

JaCoCo FAQ中也对此进行了解释:

  

为什么覆盖率报告中未显示抽象方法?

     

抽象方法不包含代码,因此无法评估代码覆盖率。实际上,为实现这些方法的子类记录了代码覆盖率。接口中的非默认方法也是如此。