2012-02-26 6 views
1

2つのarrayListを比較するjunitテストを作成しようとしています。私の問題は、プログラムから情報を取得することからarrayListを1つ作成すると、順序付けられていない構造体に格納されているため、異なる順序で情報が返されることです。たとえば、私は "aまたはb"を1回、 "bまたはa"を次の時間に得ることができます。||を使用することは可能ですか? Javaコードのjunitテスト内の演算子ですか?

私はこのことについて私の教授に話したとき、||を使ってjunitテストを設定することができたと彼は言った。戻り値のデータは "aまたはb"または "bまたはa"と一致します。私はjunitテストでor演算子をオンラインで使うのを探しましたが、何も見つけられませんでした。これが本当に可能な場合は、誰かが適切なフォーマットを提供できますか?ありがとう!あなたはアサーションで次の操作を行うことができ

+0

情報が不十分です。 "a or b"と "b or a"の意味がはっきりしていません。返されるListにa-bの順番で要素が含まれていますが、参照データはb-aの順序で表示されていますか? –

答えて

1

assertTrue((result == a) || (result == b)); 

あなたの結果は、AまたはBのどちらかであるかどうかをテストすることができます。

1

ので、同様に、私はこの主張を実装します:

public void assertEqualsUnordered(Collection<?> a, Collection<?> b) { 
    assertEquals(a.size(), b.size()); 
    List<Object> aCopy = new ArrayList<Object>(a); 
    for(Object o : b) { 
    assertTrue(aCopy.remove(o)); 
    // fails if this object wasn't present in aCopy, 
    // but if it succeeds, removes one of "o" from aCopy 
    } 
} 

これは、任意のコレクションに取り組む彼らはリストである、セット、または何でもする必要があります。

2

これはおそらく実行できますが、実行できません。

ユニットテストは確定的でなければなりません。テストオペレーションは毎回同じ出力を常に出力する必要があります。つまり、単体テストのステートメントはコードの匂いです。

本当に心配しているように、aとbの両方がリストにあるようです。それが本当に心配しているのであれば、注文のテストはあなたが必要とするよりも強いアサーションです。これは弱いものと同じくらい悪いこともあります。あなたがこれを行うことができるように

は物事を再編成してみてください。

assertTrue(theList.contains(a)); 
assertTrue(theList.contains(b)); 
+0

ええ、これはほとんどの時間で動作します。しかし、繰り返しの要素がある場合は機能しません。リストが 'a、a、b'の何らかの順序でなければならない場合、リストが実際に' b、b、a'であれば、これは誤って真を返します。 –

+0

その場合は、必要な要素が正しい順序で、 '.equals'を使用する以外のリストを作成したいことがあります。テストするのが簡単になるように、アプリケーションコードをリファクタリングすることもできます。 –

+0

あなたは私が前に投稿した答えを記述しているように聞こえます。 –

0

あなたは

expectedListが自然な順序でソートされた権利の要素を持ってい
Collections.sort(theList); 
assertEquals(expectedList, theList); 

ような何かをしないのはなぜ。

2

これは、Hamcrestコレクションマッチャーが非常に便利になる場所です。

あなたがこれはあなたが後にしているチェックを実行

assertThat(theList, containsInAnyOrder(a, b)) 

を使用することができ、きれいな、簡潔な、読み取り可能なコードで、アサーションが失敗した場合にも、豊富な記述を提供します。