java - Jacoco 未检测到接口(interface)

标签 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 存储库接口(interface)。

例如以下界面:

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包被跳过了。 我相信这是因为目标类是一个接口(interface),但我不确定。

您知道可能出现什么问题以及如何解决它吗?

最佳答案

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 中也对此进行了解释:

Why are abstract methods not shown in coverage reports?

Abstract methods do not contain code, therefore code coverage cannot be evaluated. Indeed code coverage is recorded for subclasses implementing these methods. The same applies to non-default methods in interfaces.

关于java - Jacoco 未检测到接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53665182/

相关文章:

spring - 在 Spring MVC 应用程序中测试转发

java - Uberjar仅具有依赖项

java - spring boot jpa存储库接口(interface)始终返回null

android - 当我的 Activity 依赖于通过 Intent 传递的额外内容时,如何编写 android JUnit 测试?

SuiteClasses 语法的 Java JUnit 类数组

rest - Spring-boot 使用可分页测试休息 Controller

java - 在Java中,有没有可能执行一个方法一段时间,达到时间限制就停止?

java - 未显示可扩展 ListView Activity 。我该如何修复。?

javascript - 在 javascript 文件中使用 Maven 原型(prototype)模板变量

spring-boot - Spring Boot 为 flywaydb 和 JPA 使用单独的用户