[英]Android Studio 3/Kotlin code coverage
我的Android應用程序是多模塊項目:
include (android-app/kotlin-android)':application', (pure kotlin)':presentation', (pure kotlin)':domain', (android-library/kotin-android)':dataproviders'
我正在使用Junit / Mockito進行測試,我遇到的問題只是為kotlin android模塊生成代碼覆蓋率。 Android studio可以看到經過測試的行。
ui.viewmodel包中的測試類:
但是,對於純kotlin (例如域,演示)測試覆蓋率工作正常:
我正在使用Android Studio 3.0 Canary 8您可以在github上查看我的build.gradle文件:
android應用程序模塊中的示例測試:
純kotlin模塊中的示例測試:
有人可以幫我解決我的問題嗎? 我嘗試通過Jacoco生成代碼覆蓋,但它也沒有顯示代碼覆蓋率。
解決方案是在build.gradle for module中添加此gradle任務:
task copyTestClasses(type: Copy) {
from "build/tmp/kotlin-classes/debugUnitTest"
into "build/intermediates/classes/debug"
}
並運行:
gradlew copyTestClasses
然后生成代碼覆蓋率報告沒有問題。
雖然來自@Hype的解決方案可行,但它也會讓環境變得有些混亂,因為你最終將kotlin類文件和META-INF放在與java類文件相同的目錄中。 這可能會讓您在第二次運行編譯時遇到一些問題。
另一個解決方案是將kotlin類的路徑添加到jacoco配置參數classDirectories
。 這個解決方案只是告訴jacoco它需要評估來自兩個不同文件樹的文件。 好處是它不會改變你的環境。 下面是一個如何組合來自多個目錄的類文件的示例,不包括任何不需要的文件(這取決於您的項目設置,您可能使用匕首並且必須排除匕首生成的文件):
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
這是一個很好的指南 ,介紹如何為Java設置它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.