2017-06-17 4 views
-1

特定のURLアドレスからデータを取得し、それをStringとしてArrayListに追加できるメソッドをテストしたいと思います。今のコード:バッファリングされたリーダーテスト

public List<String> getListOfAirportsFromCsvAsAStrings(String urlAddress) { 

    BufferedReader reader = null; 

    try { 
     URL url = new URL(urlAddress); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

     connection.setRequestMethod("GET"); 

     reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

     String line = null; 
     while ((line = reader.readLine()) != null) { 
      airportsAsAStringFromCsvFile.add(line); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (reader != null) { 
      try { 
       reader.close(); 
      } catch (IOException ioe) { 
       ioe.printStackTrace(); 
      } 
     } 
    } 
    return airportsAsAStringFromCsvFile; 
} 

このメソッドはテスト可能ですか?

+0

ニースの回答ですが、質問自体が広すぎる.. – GhostCat

答えて

1

これは適切なユニットがテストすることができない悪いコード、単体テストはいくつかのコードをテストすることです "ユニット"通常はクラスでは、このコードは、実際の実装ではなく模擬クラスを使用する必要がある他のクラスが必要です。

あなたのケースでは、ストリームから読み取るコードからネットワークに行くコードを切り離す必要があります。

public class Parser { 

    public List<String> getListOfAirportsFromCsvAsAStrings(InputStream inputCsvData) { 
     List<String> airportsAsAStringFromCsvFile = new ArrayList<>(); 
     try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputCsvData))) { 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       airportsAsAStringFromCsvFile.add(line); 
      } 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
     return airportsAsAStringFromCsvFile; 
    } 
} 

私はコードを簡素化します(Java 7以降が必要です)。そして、これはあなたのパーサーのテストクラスです:

import example.Parser; 
import org.junit.Assert; 
import org.junit.Test; 

import java.io.ByteArrayInputStream; 
import java.io.InputStream; 
import java.util.Arrays; 
import java.util.List; 

    public class ParserTest { 

     @Test 
     public void shouldReturnParsedTextFromInputFileStream() throws Exception { 
      String text = "row1\nrow2\nrow3"; 
      InputStream inputFileStream = new ByteArrayInputStream(text.getBytes()); 
      Parser parser = new Parser(); 
      List<String> result = parser.getListOfAirportsFromCsvAsAStrings(inputFileStream); 
      List<String> expected = Arrays.asList("row1", "row2", "row3"); 
      Assert.assertEquals(expected, result); 
     } 
    } 

は、あなたのクラスパスにJUnitのライブラリを持っていると仮定します。 P.P.私の意見では、このコードはまだにおいがあり、あなたのコードをより多くリファクタリングする必要があります。

1

本発明の方法は、試験する痛みである。 TDDの方法では明らかに行われていません。

テスト中のコードにHttpURLConnectionを作成しないでください。発信者が1インチを渡すようにしてください。そうすれば、テストで簡単に偽装して、ネットワーク接続のように見えるものを渡すことができますが、実際のものではありません。ユニットテストからネットワークのような外部依存関係を保つ。プロダクションコードでは、接続が1か所で作成される場合は、接続プーリングやその他の接続の詳細を簡単に追加できます。

例外を飲み込まないでください。どんなエラーも気付かれません。先行きのデバッグの時間。エラーの動作をテストすることさえできません。

airportsAsAStringFromCsvFileはメンバー変数ですか?おそらくローカル変数でなければならず、関数を静的にすることができます。

また、リソースを試してみることもできます。

を持っていることがあります。

TDDの本として、あなたは試みることができます

+0

ありがとう、TDDテストの良いチュートリアルはありますか?私はいくつかの本、チュートリアルを見ましたが、例は実際のコードからではなく非常に単純です... TDDテストの考え方を変えるのは難しい – przemekost

+0

@przemekostこれを試してみてくださいhttps://www.amazon.com/Practical-Unit-Testing- JUnit-Mockito/dp/8393489393 – fxrbfg

+0

@przemekost私の答えを更新しました – Robert

関連する問題