2016-04-04 5 views
1

csvリーダーを単体テストしてcsvを読み込み、それをPOJOに入れてクエリを作成したい場合は、それは意味がありますか? (具体的には、私はファイルを読んで嘲笑を意味する)。csvリーダー用のmockitoと単体テスト

はのは、次の例を想定してみましょう:

ICsvBeanReader beanReader = null; 
    beanReader = new CsvBeanReader(new FileReader(csvFileName), 
      CsvPreference.STANDARD_PREFERENCE); 
    String[] header = beanReader.getHeader(true); 
    Book bookBean = null; 
    while ((bookBean = beanReader.read(Book.class, header, 
     processors))!= null) { 
    books.add(bookBean); 
    } 

は、事前にありがとうございます。

答えて

2

厳密に言えば、単体テストは、コードをプログラムの外部部分と統合するのではなく、コードの機能をテストするように設計されています。実際のファイルを読む機能をテストすることは、ユニットテストではなく、の統合テストです。ファイル・リーダーが実際のファイルで機能することを確認したいので、統合テストも重要です。しかし、コードが確実に実行されるように、単体テストを作成することもできます。

ユニットテストを作成するには、ファイルリーダーオブジェクトを模擬してダミーの応答(byte[]またはそのインタフェースが提供するタイプ)を返すことができます。 POJOを実装し、すべてが期待どおりに動作するというアサーションを行うことができます。

要約すると、統合テストと単体テストの両方が良い考えかもしれませんが、単体テストではコードのロジックを分離してテストすることができます。

更新:

アカウントに更新されたコードのサンプルを取るために、私はこのようなCsvBeanReaderをからかって行くでしょう:

ICsvBeanReader mockedBeanReader = mock(CsvBeanReader.class); 
Book book1 = new Book(); 
Book book2 = new Book(); 
Book book3 = new Book(); 
when(mockedBeanReader.getHeader(true)) 
    .thenReturn(new String[]{"here", "is", "header"}); 
when(mockedBeanReader.read(Book.class, header, processors)) 
    .thenReturn(book1) 
    .thenReturn(book2) 
    .thenReturn(book3); 

そして今、あなたは完全に嘲笑CsvBeanReaderオブジェクトを持っています。 POJOでアサーションを実行し、コードのビジネスロジックが正しいことを確認できます。

+0

ありがとうございます。質問があります。ファイルリーダーがダミーレスポンスを返した場合、何が嘲笑されていますか?質問にサンプルコードを追加しました。 –

+1

とてもいいです。ありがとう。 –

2

これは良いアイデアのようです。これは、あなたのユニットをread()の実装からデカップリングすることができます。そうすれば、ファイルを読み込むために別のライブラリに変更した場合、単体テストをすべて書き直す必要はありません。

+0

これは単体テストの問題の分離を実現するのに役立ちます。 –