Я тестирую приложение с JUnit5 и использую Jacoco для отчета о покрытии. Тесты выполнены нормально, и отчеты о тестировании присутствуют.
Однако отчет Jacoco имеет следующие журналы, если служба содержит методы, помеченные @ Transactional
[ant:jacocoReport] Classes in bundle 'my-service' do no match with execution data. For report generation the same class files must be used as at runtime.
[ant:jacocoReport] Execution data for class mypackage/SampleService does not match.
Эта ошибка возникает для всех классов @Service методы, аннотированные @Transactional, покрытие простых классов рассчитывается нормально.
Вот пример теста:
@SpringBootTest
@ExtendWith(SpringExtension.class)
public class MyServiceTest {
@Autowired
private SampleService sampleService;
@Test
public void doWork(){
sampleService.doWork();
}
}
Работает нормально. Покрытие не равно нулю:
public class SampleService {
public void doWork(){
System.out.println("HEY");
}
}
0% покрытия:
public class SampleService {
@Transactional
public void doWork(){
System.out.println("HEY");
}
}
Транзакционный создает прокси вокруг класса actall. Но разве не существует готового способа для Jacoco справиться с такой распространенной ситуацией?
Я попробовал аннотацию @EnableAspectJAutoProxy с различными вариантами флагов, проверил этот современный движок Jupiter и Используется плагин Jacoco
Вот конфигурация gradle:
subprojects {
test {
useJUnitPlatform()
}
jacocoTestReport {
afterEvaluate {
classDirectories.from = files(classDirectories.files.collect {
fileTree(dir: it, exclude: '*Test.java')
})
}
reports {
html.enabled = true
xml.enabled = true
csv.enabled = false
}
}
}
Любая помощь приветствуется