きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

独自クラスローダーとJacoco

これまではApache Antで、事前にJacocoのoffline instrumentationを施してからテストをしていたが、さいきんgradleに乗せ代えてon the flyになり、カバレッジが取れてない状況があった。


独自クラスローダーで、クラスを再読み込みしているテストケースでうまくカバレッジを取れていない。


迂回する方法はないかと、jacoco agentにclassdumpdirオプションを指定することにした。
gradleではclassDumpFileって書くことになるのはご愛嬌。
結果、何も出力されなかった。
お、おかしい。
何かを見落としている。


Jacocoのコードを再度確かめた。
その結果、ProtectionDomainの判定が怪しいと気付くに至った。


java.lang.instrumentパッケージのうちClassFileTransformerは、ClassLoaderのdefineClassと密接な関係がある。
defineClassの際、ProtectionDomainにCodeSourceを詰めて渡さないと、Jacoco Agentはそっぽを向いてしまうようだ。


長年の謎がやっと解けた。