2017-01-03 4 views
0

私はHashMapを取り、カンマで区切られた文字列にキーを連結する関数を単体テストしようとしています。問題は、私はのentrySet(またはのkeySetまたは値)を使用してHashMapのを反復処理するときの値がに)私は.put順(でそれらをないということであるIE:。 HashMap値に基づいて文字列を作成する関数を単体テストテストするにはどうすればよいですか?

testData = new HashMap<String, String>(0); 
testData.put("colA", "valA"); 
testData.put("colB", "valB"); 
testData.put("colC", "valC"); 
for (Map.Entry<String, String> entry : testData.entrySet()) { 
    System.out.println("TestMapping " + entry.getKey()); 
} 

は私に次のような出力が得られます。

TestMapping colB 
TestMapping colC 
TestMapping colA 

SUTによって作成された文字列はColB,ColC,ColA

どのようにすることができますIユニットテストこのなどのkeySet()、値セット()、以来、彼らのために、多少任意ですか?

これは、私がテストしようとしている機能である:

public String getColumns() { 
    String str = ""; 
    for (String key : data.keySet()) { 
     str += ", " + key; 
    } 
    return str.substring(1); 
} 
+3

なぜでしょうか? 'LinkedHashMap'は意図命令を維持しますが、' Map'''interface'は反復順序を定義しません。 –

+1

'HashMap'は、トラバーサル時の挿入順序を保証しません。代わりに 'LinkedHashMap'のようなものを使う必要があります。 – manouti

+1

あなたはどのような問題を解決しようとしていますか?あなたは配列を使うことができないと言ったので、あなたは 'HashMap'を使うことに決めました - これはデータ構造を選ぶ非常に奇妙な基準です。サイズ変更可能な配列が必要な場合は、 'ArrayList'を使用できます。 –

答えて

1

HashMapのは、あなたが挿入順序は、のLinkedHashMap

+0

回答する前に重複を検索してください。あなたが答えを選ぶなら、まともな答えを書いてください。コメントでなければならない単一の文章だけではなく、参考文献を使用してください。 –

+0

この場合、参考文献と言うと、私はjava文書への参照を与えなければならない – prashant

+0

理想的には、 'HashMap'には未定義の反復順序があり、 'LinkedHashMap'には定義された反復順序。あなたが実際に停止を引っ張っているなら、あなたは 'LinkedHashMap'を使うように書き直してOPのコードスニペットを投稿することができます。しかし、私はこのことが必ずしも必要ではないと思っています。 –

2

維持利用になりたい場合はポイントはありません....挿入順序を維持しません。この場合はHashMapを反復処理します。それを反復する唯一の理由は、期待されるStringを構築することです。言い換えれば、テスト中のメソッドと同じ操作を実行するため、メソッドを実装する際にエラーが発生した場合、同じメソッドを実装するときにエラーを繰り返す可能性があります単体テストでは、エラーを発見できませんでした。

出力の妥当性に焦点を当てる必要があります。それをテストする1つの方法は、キーに分割し、それらがソースマップのキーと一致するかどうかをチェックすることです:

testData = new HashMap<>(); 
testData.put("colA", "valA"); 
testData.put("colB", "valB"); 
testData.put("colC", "valC"); 

String result = getColumn(); 
assertEquals(testData.keySet(), new HashSet<>(Arrays.asList(result.split(", ")))); 

あなたは何", "は内表示されないことを保証できるようにするには、テストデータの制御でありますキーストリング

Stringに先頭のスペースが追加されているため、現在の形式では質問の方法が失敗することに注意してください。意図的であるかどうか(この場合は、テストをassertEquals(testData.keySet(), new HashSet<>(Arrays.asList(result.substring(1) .split(", "))));に変更する必要があります)、または見つかったバグ(最後にメソッドの最後の行をreturn str.substring(2);に変更する必要があります)を判断する必要があります。

空のマップのテストケースを忘れないでください。

関連する問題