2016-04-15 8 views
1

私はApache POIメソッドを使ってJavaのシートをExcelに書き出しています。私が書いた方法のために単体テストをしなければならない。私はApache POIの多くのメソッドを使用しています。 Apache POIのさまざまなオブジェクトクラスのすべてのメソッドをスタブする必要がありますか?JavaのJarメソッドのユニットテスト

例:Apache POIメソッドを使用しているセルに書き込むためのラッパーメソッドを作成しました。

protected void writeCell(int rowNum, int colNum, String value, Sheet sheet) 
{ 
    if(value == null) 
    { 
     return; 
    } 
    Row row = sheet.getRow(rowNum); 
    Cell cell = row.createCell(colNum); 
    cell.setCellValue(); 
    } 

} 

私はthe Sheet.classgetRowと行クラスのcreateCellのようにも方法を模擬する必要がありますか?

+1

Apache POIメソッドの単体テストを行う必要はありません。それらをモックするだけです。また、あなたが使っていないメソッドだけを模倣する –

+0

@KP私はApache POIのテストケースを書いていません。私は自分の方法で書いています。 – Ashley

答えて

3

結果のテスト、実装ではありません。

I.e.セルを書き込むと、そのセルからその値を読み戻すことができますか?

はまた、あなたはあなただけのクラスのパブリックインターフェイスをテストする必要がある必要があり、私たちにprotected方法を示しました。パブリックインターフェイスを介して結果が表示されない場合は、クラスが多すぎる可能性があります(単体責任原則)。

はしかし、他の考慮事項は、Apache POIを読み、実際のファイルに書き込んでいるので、これらのテストを書くことが少し難しくなり、彼らは遅くなり、速度や脆弱性のものです。いくつかのテストではOKですが、スイート全体がファイルを読み書きしている場合は遅くなり、テストスイート全体が数秒で理想的に動作するはずです。

だから私はExcelシートとあなたがそれをやりたいをカプセル化するインターフェイスを作成し、これは次のようになります。

public interface StringGrid { 
    String readCell(int rowNum, int colNum); 
    void writeCell(int rowNum, int colNum, String value); 
} 

今、私は自動テストなしで迅速な実装を行う可能性があり、あるいはほんの数Apache POIについての簡単なテストですが、私のスイートの残りの部分は、StringGridFakeの実装に対してテストして、の高速で実行することができます。のコードを実行しています。

したがって、これらは次のようになります。

だけそのテストや生番組で使用される実際の実装を、。

public final class ApacheSheetStringGrid implements StringGrid { 

    private final Sheet theApacheSheet; 

    public ApacheSheetStringGrid(Sheet theApacheSheet) { 
     this.theApacheSheet = theApacheSheet; 
    } 

    public String readCell(int rowNum, int colNum){ 
     ... 
    } 

    public void writeCell(int rowNum, int colNum, String value) { 
     Row row = theApacheSheet.getRow(rowNum); 
     Cell cell = row.createCell(colNum); 
     cell.setCellValue(); 
    } 
} 

フェイク(StringGridの作業、高速で、メモリ内の唯一の実装が)、他のすべてのテストのために:

public final class FakeStringGrid implements StringGrid { 

    private final Map<String, String> contents = new HashMap<String, String>(); 

    private static String getKey(int rowNum, int colNum) { 
     return rowNum + ", " + colNum; 
    } 

    public String readCell(int rowNum, int colNum){ 
     return contents.get(getKey(rowNum, colNum)); 
    } 

    public void writeCell(int rowNum, int colNum, String value) { 
     contents.put(getKey(rowNum, colNum), value); 
    } 
} 

これは、余分な利点を持っている、あなたは後でライブの実装を入れ替えることができますおそらく他のPOIアプローチやGoogleシート実装のいずれかを使用して、いくつかのテストと新しい実装を追加するだけで、コードを変更する必要はありません(Closed Principleを開きます)。

+0

これは本当に効率的なソリューションです。ありがとう。 writeCell(int rowNum、int colNum、String value)のようなメソッドをpublicとしてテストする必要がありますか?そのため、保護されたメソッドはテストできません。 – Ashley

+0

これに従えば、それらのメソッドは別のクラスで 'public'になります。私のコード 'private'と' protected'メソッドでは、*リファクタリング(http://blog.cleancoder)を介して出てくるだけです。 com/uncle-bob/2014/12/17/TheCyclesOfTDD.html)。 – weston

+0

「失敗したテストを解決する」とはどういう意味ですか?最初にすべてのメソッドをpublicとして記述し、後に大きいメソッドをprivate/protectedとして扱うよりも小さなメソッドに分割すると言っていますか? – Ashley

関連する問題