Jacocoは、Kotlinのデータクラスに対して0%のカバレッジを示しています。カバレッジを測定するか、データクラスをまったく無視するように構成するにはどうすればよいですか?
私はデータモデルクラスの自動生成されたコードで同じテストカバレッジの問題の解決策を探していましたが、次のことに遭遇しました:
Kotlin + JaCoCo:生成されたコードをスキップするようにコンパイラを調整する
解決策:JaCoCoプラグインを0.8.2に更新すると、問題が解決します。
JaCoCoは0.8.2リリースでこの問題を解決しました。変更ログをお読みください-
データクラスを特定のパッケージまたは特定のファイルに配置した場合は、それらをclassDirectories
から除外できます。以下の例では、データクラスを**/model/**
の下に配置しています。
task kotlinJacocoTestReport(type: JacocoReport, dependsOn: 'test') {
reports {
html.enabled = true
html.destination = "${buildDir}/reports/jacoco"
}
sourceDirectories = files(["${project.projectDir}/src/main/kotlin"])
classDirectories = fileTree(dir: "${buildDir}/classes/kotlin/main", excludes: ['**/model/**'])
executionData = files("${buildDir}/jacoco/test.exec")
}
実際にはあなたの質問に答えているわけではありませんが、データクラスによって生成される関数をカバーするテストを作成することで、jacocoのデータクラスをかなり完全にカバーすることができます。
たとえば、1つのvar
と1つのval
を持つデータクラスがあるとします。
_data class MyDataClass(var s1: String, val s2: String)
_
Jacocoを実行すると、MyDataClassによって生成された次のもののカバレッジを測定していることがわかります。
hashCode()
equals(Object)
toString()
MyDataClass(String, String)
copy(String, String)
setS1(String)
getS1()
getS2()
component1()
component2()
そのほとんどをカバーする単体テストは次のようになります。
_ @Test
fun testCodeCoverageForMyDataClass() {
// call the constructor
val tested = MyDataClass("original s1", "original s2").apply {
// call the setters
s1 = "new s1"
// call the getters
assertEquals("new s1 original s2", "$s1 $s2")
// call toString()
assertEquals("MyDataClass(s1=new s1, s2=original s2)", "$this")
// call componentN() functions
val (res1, res2) = this
assertEquals("new s1 original s2", "$res1 $res2")
}
// call copy()
val testedCopy = tested.copy(s2 = "new s2").apply {
// call equals()
assertNotEquals(this, tested)
// call hashCode()
assertNotEquals(this.hashCode(), tested.hashCode())
}
}
_
それは苦痛だと私は知っていますが、サポートがあるまで、これは私が報道をやり遂げるのに役立ちます。
次の場所に記載されているプラグインを使用してください: Kotlinプラグインが生成されました
プラグインは、@ lombok.Generatedアノテーションをバックグラウンドで追加することにより、Kotlinで生成されたすべての合成コード(自動ゲッターとセッターであり、データクラスがどこにあってもきれいにカバーする必要があります)をコードカバレッジから削除します。
動作させるには、Jacoco0.8以降を使用する必要があることに注意してください。