我已经配置了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包被跳过。 我相信是因为目标类是接口,但我不确定。
您知道可能是什么问题,以及如何解决该问题?
答案 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中也对此进行了解释:
为什么覆盖率报告中未显示抽象方法?
抽象方法不包含代码,因此无法评估代码覆盖率。实际上,为实现这些方法的子类记录了代码覆盖率。接口中的非默认方法也是如此。