2009-06-18 11 views
1

ファイルから文字列を読み込み、文字列からマップを作成するJavaコードがあります。このコードはファイルに依存するため、単体テストは不器用です。コードを単体テストできるように、どのようにそのような要素を設計しますか?ファイルの読み込みとテスト可能なコード

私が考えることができるアプローチの1つは、ファイルを引数として取り込む代わりに、入力ストリームを取ることです。実際のシナリオでは、ファイル入力ストリームを渡し、ユニットテストは文字列から作成された入力ストリームを渡します。しかし、これは私にとって過度の殺害のように見えます。より良い方法がありますか?

+0

3つの重要な質問:テストデータファイルの量はどれくらいですか?良いテストケースを作成するために必要なテストデータファイルの数はいくつですか?即座にテストデータを簡単に生成できますか、手動で準備する必要がありますか? –

+0

1.テストデータファイルが大きくありません。おそらく約100語含まれています。 2.テストに必要なファイルは1ファイルで十分です。 3.はい、データを手動で準備する必要があり、即時にそのデータを生成することはできません。 – Abhi

答えて

2

あなたのコードをどのように再編成しても、テストデータはファイルから来なければなりません。

  1. データは、.javaユニットのテストソースコードファイルのいずれかでインプレースでエンコードされています。小さなテストデータセットに対してのみ機能します。記述したように、コードをリファクタリングして入力ストリームを取得し、ファイルで動作する別のラッパーを用意する必要があります。

  2. テストデータファイル。 のデータファイルをテストするには、 プロジェクト全体のコンベンションを作成する必要があります。彼らの場所は、 のジャイヴプロジェクト の場所、または共通のテスト データファイルのルートに関連する可能性があります。いずれにしても、 は、 が「論理」ファイル名で与えられた完全なテストデータファイルパスを返すユーティリティメソッドを持つのに役立ちます。

あなたの場合(1つのテスト、100ワード)のように思えますが、最初の解決策で十分でしょう。はい、コードを少しリファクタリングする必要があります。第2の解決策は、より一般的であり、個人的に私はそれをはるかに実用的かつ適用可能と考える。

データファイルで動作する場合、ユニットテストではないと言う人もいます。まあ、それは "ユニットテスト"の定義の問題であり、全く無関係です。あなたのコードをテストする必要がある場合は、プロジェクトのベスト/最も便利な方法を見つけてください。

2

このような場合は、テストケースに必要なファイルを作成し、単体テストで使用しました。私はこれらのファイル(テストデータ)専用のフォルダを用意し、テストケースを適切なファイルにするためにテストケースを設定しました。

+0

うん、私もテスト用に別々のテストリソースファイルを作成して使うだろう。 – aberrant80

4

InputStreamから読み取る機能を提供しないように設計されていますが、そのファイルを読んだだけであればエラーです。したがって、InputStreamを取得する関数を変更し、Fileを取得するラッパーを提供します。 ByteArrayInputStreamまたはStringInputStreamを使ってテストしても問題ありません。

+0

面白いです、あなたの応答は唯一の正解でした。 –

0

私は、テスト専用のデータセット(この場合はファイル)を使用することをお勧めします。さもなければ、私は外部リソースへのアクセスをシミュレートするためにモックを使用します。 いずれにしても、私は可能な限り自動テストの適用範囲を広げる傾向があります。