2016-04-13 9 views
0

私はJARを使用するJavaコードを持っている:JARを使用するJavaコードをテストするにはどうすればよいですか?

public class Version { 
    public String getVersion() { 
     // Use Java Package API to return information specified in the manifest of this JAR. 
     return getClass().getPackage().getImplementationVersion(); 
    } 
} 

は、どのように私は、このコードにJUnitテストを実行しますか?

まだJARファイルが存在しないため、開発ビルド(Eclipseで)に失敗します。

まだJARファイルが存在しないため、プロダクションビルド(Gradleで)に失敗します。

+1

あなたはモック/スタブします。 –

+2

あなたは何をテストしていますか?このメソッドのクライアントをテストする場合は、それを含むクラスまたは実装するインタフェースの適切なモックを配線します。メソッドの実装をテストしている場合は、メソッドがnullか、期待されるパターンと一致するかどうかを検証できます。 'getImplementationVersion()'自体をテストしているなら、それを止めてください。それはおそらく独自のテストでサードパーティのコードです。 –

答えて

1

単体テストの依存関係を常に模擬する必要があります。バウンダリは、コード自体ではなく、単体テストをテストします。 Mockitoのフレームワークは良いですし、仕事をする他のフレームワークがあります。

1

これは正しく嘲笑されない(したがって、ユニットテストされていない)可能性があります。ポイントは、実際には "this"のメソッドを呼び出すことです。しかし、あなたはいくつかのオブジェクトをテストすることはできません...同時にそれを嘲笑してください。

本番コードは次のようになります場合は、以下を参照してください。

public String getVersion() { 
    return someObject.getClass()..... 
} 

、あなたはモックオブジェクトを作成することができます。それをあなたのVersionクラスに挿入します。しかし、その場合でもgetClass()メソッドはfinal java.lang.Object内にあります。とにかくそれを嘲笑することはできません。

[EasyMockやMokitoのような合理的な模擬フレームワークは、クラスを拡張し、制御したいメソッドをオーバーライドすることで機能します。 PowerMockのようなバイトコードの操作を行うフレームワークがありますが、このような模倣を可能にしますが、このようなライブラリを使用するべきではありません。彼らは(ほとんどのカバレッジライブラリを破るような)本当に悪い副作用を持っているように]働くかもしれない何

class Version { 
    private final Package packageForVersionCheck; 

    public Version() { 
     this(getClass().getPackage())); 
    } 
    Version(Package somePackage) { 
     this.packageForVersionCheck = ... 
    } 

    public String getVersion() { 
     return this.packageForVersionCheck.getImpl.... 

今、あなたは、その文字列を返す「嘲笑」のパッケージを提供するために、依存性注入を使用することができます。しかし、まあ、それはほとんど利益のためのコードのように見えます。

短いストーリー:時には、合理的な単体テストを書くことができません。それから、次のベストを尽くしてください: "顧客のような"設定で自動的に実行されるいくつかの "機能"テストを作成します。このようなテストを実行するための自動セットアップがあることを確認してください。

関連する問題