我的Android应用程序是多模块项目:
&
我正在使用Junit / Mockito进行测试,我遇到了为kotlin安卓模块生成代码覆盖率的问题仅。 测试线对于android studio是可见的。
ui.viewmodel包中的测试类:
但是,对于纯kotlin (例如域名,演示文稿),测试覆盖率正常:
我正在使用Android Studio 3.0 Canary 8 您可以在github上查看我的build.gradle文件:
android应用程序模块中的示例测试:
纯kotlin模块中的示例测试:
有人可以帮我解决问题吗?我试过通过Jacoco生成代码覆盖,但它也没有显示代码覆盖率。
答案 0 :(得分:8)
解决方案是在build.gradle中为模块添加此gradle任务:
task copyTestClasses(type: Copy) {
from "build/tmp/kotlin-classes/debugUnitTest"
into "build/intermediates/classes/debug"
}
并运行:
gradlew copyTestClasses
然后生成代码覆盖率报告没有问题。
答案 1 :(得分:0)
尽管@Hype的解决方案有效,但是当您最终将kotlin类文件和META-INF与java中的类文件放在同一目录中时,也会使环境有些混乱。这可能会给您第二次运行编译时带来的一些问题。
另一种解决方案是仅将kotlin类的路径添加到jacoco配置参数classDirectories
中。
该解决方案仅告诉jacoco它需要评估来自两个不同文件树的文件。好处是它不会改变您的环境。
以下是如何组合多个目录中的类文件(不包括任何不需要的文件)的示例(这取决于您的项目设置,您可能使用dagger并必须排除dagger生成的文件):
def javaAndKotlinClassFiles = files(fileTree(dir: "${project.buildDir}/intermediates/classes/${sourcePath}",
excludes: ['**/R.class',
'**/R$*.class',
'**/*$ViewInjector*.*',
'**/*$ViewBinder*.*',
'**/BuildConfig.*',
'**/Manifest*.*',
'**/*$Lambda$*.*', // Jacoco can not handle several "$" in class name.
'**/*_Provide*Factory*.*',
'**/*$*$*.*', // Anonymous classes generated by kotlin
'**/*Test*.*', // Test files
'**/*Spec*.*' // Test files
]
).files)
.from(files(fileTree(dir: "${project.buildDir}/tmp/kotlin-classes/${sourcePath}",
excludes: ['**/R.class',
'**/R$*.class',
'**/*$ViewInjector*.*',
'**/*$ViewBinder*.*',
'**/BuildConfig.*',
'**/Manifest*.*',
'**/*$Lambda$*.*', // Jacoco can not handle several "$" in class name.
'**/*_Provide*Factory*.*',
'**/*$*$*.*', // Anonymous classes generated by kotlin
'**/*Test*.*', // Test files
'**/*Spec*.*' // Test files
]).files)
)
classDirectories = javaAndKotlinClassFiles
这里是nice guide,说明如何将其设置为Java。