我一直在研究android项目,并使用roboletric和powermock来完成unitTest。
当我运行gradle jacocoTestReport
时,它会显示
[ant:jacocoReport] Classes in bundle 'app' 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 com/my/app/MyClass does not match.
我使用powermock来模拟Myclass.java中的静态方法
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
@PowerMockIgnore({ "org.mockito.*", "org.robolectric.*", "android.*" })
@PrepareForTest(MyClass.class)
public class TheTest {
@Rule
public PowerMockRule rule = new PowerMockRule();
@Test
public void test1() throws Exception {
PowerMockito.mockStatic(MyClass.class);
// do something
}
}
build.gradle如下所示
apply plugin: 'jacoco'
def coverageSourceDirs = [
'../app/src/main/java'
]
task jacocoTestReport(type:JacocoReport, dependsOn: "testDebugUnitTest") {
group = "Reporting"
description = "Generate Jacoco coverage reports"
classDirectories = fileTree(
dir: '../app/build/intermediates/classes/debug',
excludes: ['**/R.class',
'**/R$*.class',
'**/*$ViewInjector*.*',
'**/BuildConfig.*',
'**/Manifest*.*']
)
additionalSourceDirs = files(coverageSourceDirs)
sourceDirectories = files(coverageSourceDirs)
executionData = files('../app/build/jacoco/testDebugUnitTest.exec')
reports {
xml.enabled = true
html.enabled = true
}
}
我仍然可以看到覆盖率报告而没有失真。
但如何摆脱这种警告?
谢谢。
答案 0 :(得分:5)
当您使用Java版 X 编译类并运行测试(jacoco)但运行 jacocoTestReport 任务(在Gradle中)时会发生这种情况,使用另一个Java版本,即Java Y 。
您是在设置不同的JAVA版本还是使用不同的Gradle(使用不同的JAVA)?当您看到关于类xxx / yyy / zzz的执行数据的此警告/错误消息不匹配时,您可能会获得部分覆盖,这意味着它将反映0%的覆盖率。
解决以下问题:
[ant:jacocoReport] Classes in bundle 'app' 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 com/my/app/MyClass does not match.
确保:
或,如果上述内容没有帮助,
例如:
gradle clean build
gradle ...some..nonUnitTestTask
然后
gradle jacocoTestReport -x test -x testClasses -x compileJava -x classes
答案 1 :(得分:0)
当我尝试运行与jacocoTestReport
任务分开的test
任务时,我遇到了这个问题,而不是不同的Java版本,只是过时的类。
一种解决方法是确保获得全新构建和新的测试运行:
$ gradle clean && gradle test && gradle jacocoTestReport
另一种方法是创建一个按顺序运行test
和jacocoTestReport
的复合任务。在build.gradle
:
task coverage {
dependsOn 'test'
dependsOn 'jacocoTestReport'
tasks.findByName('jacocoTestReport').mustRunAfter('test')
}
我是JaCoCo的新手,我觉得这应该更容易,但这对我有用。
答案 2 :(得分:0)
如果您使用的是IntelliJ + Maven,请尝试此
转到文件->使缓存无效/重新启动