2012-04-19 8 views
3

ユニットテストに関する質問があります。私は数日間それについて考えており、答えを見つけることができませんでした。モックを使用する場合、このシナリオでユニットテストの目的は何ですか?

私は、Webサービスからファイルをダウンロードしてディスクに書き込む機能を持っています。実際にファイルがダウンロードされ、ディスクに書き込まれていないことをテストせずにテストする目的は何ですか?

私はWebサービスを模擬することができますが、このシナリオではどのようにしたらよいですか?私の知る限り、Mockitoのようなものは動作を模擬していますが、意味のあるデータ(この例ではファイル)を与えていません。

ウェブサービスの動作を模擬することができたとしても、実際に何かディスクに書き込むことなくファイルをディスクに書き込む方法を教えてください。

申し訳ありませんが、具体的な例はありません。お気軽にご意見をお寄せください。

感謝

答えて

5

は、私はいつもそれが私がこのクラスを分離し、分離して、それをテストすることができますどのように考えるのは、あなたを強制として、あなたのコードをテストユニットは、それがよりモジュラーなりますことを言います。

ファイルをディスクに書き込むなどのテストを行う場合は、代わりにファイルを書き込んで、OutputStreamと対話できるようにすることができます。これにより、単にByteArrayOutputStreamを関数に渡すことができます。 actual FileOutputStreamこれで、バイトをStringに変換し、内容が実際に期待されるものと一致するかどうかを確認できます。

一時ファイルを作成して、テンポラリファイルのFileOutputStreamを渡して書き込むこともできます。その後、ファイルの内容を確認することができます。この方法は、OutputStreamと対話することにより

、あなたはそれはあなたが言及したようにFileOutputStreamなど

を作成し、ファイルパスを識別するプロセスから分離させる、それがあれば、この機能をテストしても、あまり意味がないかもしれません単に一部のWebサービスからデータを取得し、ファイルに書き込むだけです。しかし、データをインテリジェントに操作したり、Webサービスのやりとりが例外をスローしたときに何かを行うと予想される場合に、テストするのは面白いでしょう。

+0

啓発の回答 – goh

+0

+1良い答え - 一時ファイルの使用は間違いなく良いですが、私が言うことの1つは、テストが後でそれらを削除してビルドを防止することです(なぜレッスンでは、 CIサーバーは完全なディスクを持っていた...) – robjohncox

+0

@robjohncox作成中のファイルに対して常に 'deleteOnExit'を呼び出すことができます。 –

4

私には、Webサービスからファイルをダウンロードしてディスクに書き込む機能があります。実際にファイルがダウンロードされ、ディスクに書き込まれていないことをテストせずにテストする目的は何ですか?

ありません。あなたは単体テストでそれをテストしません。このような場合(ネットワーク、ファイルシステム、データベースとの対話)には、integration testsと記述します。ユニットテストにも同様のツールやフレームワークを利用することがよくありますが、コンポーネントの統合や相互作用をテストするという目的は異なります。インテグレーションテストは、アプリケーションの実際の使用状況を模倣することがよくあります。

あなたのすべての機能がファイルをダウンロードするために1つのサービス/コンポーネントを呼び出し、もう1つをディスクに保存する場合は、ユニットテストがかなり制限されています。

関連する問題