7

いくつかの静的フィールドを持つ 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または一般的な方法で)?

4

2 に答える 2

0

これは投機的です。

いくつかの定数PDMapCacheDAOを使用するインターフェイス/抽象クラスだと思います。PDMapCacheDAOImpl

そしてクラスPDMapCacheDAOImplは実装/拡張しPDMapCacheDAOます。右?

これは技術的に醜い解決策 (reciproke の依存関係) だと思うので、PDMapCacheDAOsこれらの定数を使用して別のインターフェイスを作成してください。

それは問題を解決するかもしれません。

于 2013-02-01T09:59:29.100 に答える
0

最後に、代わりに Singleton を使用し、静的初期化に関するすべての問題を回避することにしました。問題はまだ残っており、将来また発生する可能性があることを企業に伝えなければなりませんが、SQA チームが問題を解決するのが待ちきれません。

すべての回答と時間を割いていただきありがとうございます

于 2013-02-01T12:07:39.720 に答える