Jacoco не обнаруживает интерфейсы - PullRequest
0 голосов
/ 07 декабря 2018

Я настроил 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 голосов
/ 07 декабря 2018

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, только объявление метода и аннотации, использующие константы.

Это также объясняется в FAQ по JaCoCo :

Почему абстрактные методы не отображаются в отчетах о покрытии?

Абстрактные методы не содержат код, поэтому покрытие кода не может быть оценено.Действительно, покрытие кода записывается для подклассов, реализующих эти методы.То же самое относится и к нестандартным методам в интерфейсах.

...