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/

相关文章:

java - 方法 getItemCount 中的空指针异常

spring - 为什么没有像 RestTemplate 中的 postForEntity 那样的 patchForEntity 方法?

eclipse - 如何配置 Eclipse 以自动运行测试?

java - 模拟来自正在测试的同一类的 void 方法

用于扩展 QuartzJobBean 的类的 Junit

java - Disruptor helloworld 示例

java - 按位运算符的负操作数如何在 Java 中工作?

java - Proguard : google. gms - 重复的 zip 条目 c.class == zzab.class

spring - 将Spring Boot从1.3.7升级到1.4.0导致AuthenticatorBase.getJaspicProvider中的NullPointerException

java - spring boot中@Table注解中添加表名后如何修复 "Table <table_name>"不存在异常