いくつかの静的フィールドを持つ Java クラスがあります。
private static final PDMapCacheDAO REST_CACHE_DAO =
new PDMapCacheDAOImpl( Constants.REST_CACHE_NAME );
private static final PDMapCacheDAO HOLIDAYS_CACHE_DAO =
new PDMapCacheDAOImpl( Constants.HOLIDAYS_CACHE_NAME );
private static final String[] DATE_ARRAY = { "D", "0", "1", "2", "3", "C" };
JUnit テストは、REST_CACHE_DAO と HOLIDAYS_CACHE_DAO の初期化動作をモックします。
final PDMapCacheDAOImpl holidaysMapCacheDAOImpl = mock(PDMapCacheDAOImpl.class);
final PDMapCacheDAOImpl restMapCacheDAOImpl = mock(PDMapCacheDAOImpl.class);
whenNew(PDMapCacheDAOImpl.class).withArguments(Constants.HOLIDAYS_CACHE_NAME).thenReturn(holidaysMapCacheDAOImpl);
whenNew(PDMapCacheDAOImpl.class).withArguments(Constants.REST_CACHE_NAME).thenReturn(restMapCacheDAOImpl);
テストを個別に実行すると、テストは期待どおりに実行されますが、すべての JUnit テストを一緒に実行すると (Java プロジェクトから [Run As] --> [Junit Test] を使用して)、テストで null ポインター例外が発生します。
いくつかのデバッグを行ったところ、問題は (タイトルに記載されているように) 静的クラスが初期化されていないことであることがわかりました。静的メソッドが呼び出されたときに REST_CACHE_DAO と HOLIDAYS_CACHE_DAO が null です。PDMapCacheDAOImpl のコンストラクターは呼び出されず、モックは注入されないため、それらを使用すると NPE が発生します。
このエラーが発生するeclemmaなど、テストを実行するためのツールについて読んだことがあります(一部の静的クラスは初期化されていません)。この場合の解決策は、-f オプションを含めることです。
これは、Eclemma の Web サイトがこの問題について述べていることです。"
2.8。クラスカバレッジはEMMAによってどのように定義されていますか? まず第一に、カバレッジの対象と見なされるためには、クラスが実行可能であると見なされる必要があります。実行可能クラスは、JVM によってロードおよび初期化されている場合、カバーされていると見なされます。クラスの初期化は、クラスの静的コンストラクター (存在する場合) が実行されることを意味します。他のメソッドが実行されていなくても、クラスをカバーできることに注意してください。-f オプションを指定せずに emmarun を使用すると、ロードされているが初期化されていない少数のクラスが表示されるのが一般的です。EMMA はクラス カバレッジをレポートするので、テスト スイートによって「影響を受けていない」と思われるクラスを見つけることができます。これらのクラスは、デッド コードであるか、さらにテストの注意が必要である可能性があります。
興味深いことに、私たちは Eclemma を使用しておらず、Cobertura を使用していますが、動作とエラーは同じです。
Cobertura のこのエラーとその解決方法について知っている人はいますか? (Coberturaまたは一般的な方法で)?