我有一个用 Kotlin 编写的 Android 服务,我使用 Guice 注入它。它有不能为空的 Lateinit 字段,但它们必须是 Lateinit 因为我不能使用构造函数注入。
围绕这些线的一些东西:
class VibrationService : Service() {
@Inject
private lateinit var pm: PowerManager
private lateinit var wakeLock: WakeLock
override fun onCreate() {
AlarmApplication.guice().injectMembers(this)
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "VibrationService")
wakeLock.acquire()
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我创建 JaCoCo 报告时,访问任何 Lateinit 字段的所有行都被标记为部分覆盖。我认为 Kotlin 编译器对字节码添加了一些检查,以确保字段在访问之前已初始化。
有什么办法可以禁用这些检查吗?我想要 100% 的覆盖率:-)
我想在 Travis 构建完成后自动将我的 Jacoco 测试报告上传到 Coveralls。它适用于 Java,但如何为 Kotlin 配置它?
错误信息
我可以在本地和 Travis 上生成 Jacoco 测试报告,但是当 Travis 尝试提交给工作服时,它会失败并显示消息
> Task :coveralls
No source file found on the project: "kotlin-template-project"
With coverage file: /home/travis/build/myname/myreponame/build/reports/jacoco/test/jacocoTestReport.xml
Run Code Online (Sandbox Code Playgroud)
Google 将我链接到 Gradle 插件实现,它显示了它在哪里抛出此消息,它告诉我(我认为)找到了 Jacoco 报告文件,但没有找到工作人员显然需要的源文件。
我试过的
因此,我尝试通过所有这些方式将工作服任务指向我的源文件:
coveralls {
sourceDirs += allprojects.sourceSets.main.allSource.srcDirs.flatten()
sourceDirs += files(sourceSets.main.kotlin.srcDirs).files.absolutePath
project.extensions.coveralls.sourceDirs += project.sourceSets.main.kotlin.srcDirs
sourceDirs += ['src/main/kotlin']
jacocoReportPath = 'build/reports/jacoco/test/jacocoTestReport.xml'
sourceDirs += ['src/test/kotlin']
sourceDirs += ["${projectDir}/src/main/kotlin"]
}
Run Code Online (Sandbox Code Playgroud)
我也尝试添加sourceSets project.sourceSets.main到jacocoTestReport任务中。
项目设置
我的最小build.gradle文件:
plugins {
id 'org.jetbrains.kotlin.jvm' …Run Code Online (Sandbox Code Playgroud) 有兴趣寻找在 CI 管道中运行良好的 kotlin 代码覆盖率工具。使用 intellij 内置代码覆盖率,但不能在 CI 中使用它。谢谢
有没有办法测量Kotlin代码的测试覆盖率?Jacoco给出了错误的结果,因为无法确定自动生成的代码.还有其他解决方案吗?