2017-10-30 5 views
0

サードパーティライブラリを使用して外部サービスからデータを取得するJavaクラスがあります。このサードパーティライブラリには、データを取得する静的メソッドがあります。 JunitまたはMakitoを使用して、このケースでどのように100%コードカバレッジを達成できますか?私は静的メソッドを模擬して、複数のパスに到達することができません。 クラスは、このようなものになります。サードパーティの静的メソッドのコードカバレッジ

import com.company.dataprovider; 

Class DataAccess { 
    public String getData(String key) { 
    try { 
     DataObject data = dataprovider.getData(key); 
     return data.toString(); 
    } catch (ThirdPartyDataException ex) { 
     log(ex); 
     throw new DataAccessException(ex); 
    } 
    } 
+0

あなたのコードはどのようにこのライブラリを使用していますか? DIを使ってライブラリをスタブしてコードをテストできますか?出版社がそれを世話しておく必要があるので、ライブラリ自体をテストする必要はありません。 – ssc327

+0

合意して、パブリッシャーのコードをテストする必要はありません。 DataAccessクラスに何かを挿入すると、どうなるでしょうか? 静的メソッドであるため、dataproviderクラスを渡すことは静的メソッドを擬似することができないため役に立ちません。 – Thor

+0

コードサンプルからは、サードパーティのライブラリを呼び出しますか? – ssc327

答えて

0

を問題の核心は、コードがサードパーティのライブラリに強い依存関係を持っていることのようです。それを取り除くことができれば、より良い場所にいるはずです。

これを行うには、まず、サードパーティのライブラリによって行われた作業の種類を表すインターフェイスを作成します。たとえば、IDataProviderにはgetData(key)という1つのメソッドがあります。

Class DataProviderImpl implements IDataProvider { 
    public getData(key) { 
     **call the third party static method** 
    } 
} 

次へ]を使用すると、フィールドとしてIDataProviderのインスタンスを必要とするいくつかの方法を見つけるためにあなたのクラスを変更します。そして、あなたは、静的メソッドを呼び出して、具体的なデータプロバイダの実装DataProviderImplを作るアプローチのような組成物を用いて

今、あなたのコードは、サードパーティのライブラリに強い依存関係を持っていない

@autowired private IDataProvider dataProvider; 

:どちらかsetterメソッドまたはおそらく春の配線と、それを渡します。

最後に、テストの目的で必要なことを行うように、IDataProviderの実装を変更します。

+0

あなたは問題の要点に近づいています。 問題は、サードパーティの静的メソッドを呼び出すメソッドをテストする方法です。 開発したすべてのコードに対して100%のコードカバレッジを必要とするプロジェクトでは、インターフェイスを作成してテスト実装するだけでは、実際の実装コードをテストする問題は解決されません。 あなたの例では、DataProviderImplクラスの単体テストをどのように記述しますか? – Thor

+0

あなたはまた、それがSpringアプリケーションであると仮定しています。 – Thor

+0

dataProviderクラスの実際の実装をテストする必要はないと主張します。なぜなら、テストする責任を負う第三者のライブラリを呼び出す以外に何もしないからです。データプロバイダを呼び出すコードをテストするだけです。これは、100%のコードカバレッジを義務化することが問題になることがあるという良い例のようです。不必要な時間はテストを強制するために費やされます。 – ssc327

関連する問題