2017-07-27 10 views
0

文字列要素の配列が、標準Collection.isInを使用する2次元配列の要素の1つであると主張しようとしています。 Hamcrestライブラリを提供しています。残念ながら、次のアサーション例外受信:配列が2次元配列の要素の1つであるかどうかをチェックする方法

java.lang.AssertionError: 
Expected: one of {["A", "B", "C"], ["A", "B", "C"]} 
    but: was ["A", "B", "C"] 

コード:

String[][] expected = new String[][] { { "A", "B", "C" }, { "A", "B", "C" } }; 
String[] actual = new String[] { "A", "B", "C" }; 

assertThat(actual, isIn(expected)); 

を私はこのようにしてhamcrestを使用して検証することはできますか?または、私は与えられたシナリオのために私自身のmatcherを作成する必要がありますか?

+1

私は短い文字列を置換することにより、読みやすい質問をしました。質問や回答には影響しません。 – slim

答えて

3

は問題がObject.equals()は、オブジェクトが配列であるとき、あなたが期待するかもしれない何をしないということです。すでに知っているとおり、Arrays.equals()を使用する必要がありますが、Hamcrest isIn()ではこれが許可されていません。

おそらく最も簡単な解決策は、テストのためにも、場合にのみ、Listに変換することである - HamcrestとしてList.equals()作品が期待しているため:

String[][] expected = new String[][] { { "A", "B", "C" }, { "A", "B", "C" } }; 

Object[] expectedLists = Arrays.stream(expected).map(Arrays::asList).toArray(); 

String[] actual = new String[] { "A", "B", "C" }; 

assertThat(Arrays.asList(actual), isIn(expectedLists)); 
+0

ハムクレストを使用したリストベースのソリューションを提供してくれてありがとう。 – Vivek

1

あなたの配列はexpectedに配列と同じ内容を含むことができますが、同じオブジェクトではありません。

0

私は、メソッドがオブジェクトではなく内容を比較するため、問題があると推測しています。基本的には、両方とも同じコンテンツを持っていても、同じオブジェクトではありません。 See here in the docs

代わりにこれを行います。すべての

String[] actual = new String[]{"A1 C1 E1 F1 J1", "A1 C1 E1 F1 K1", "A1 B1 G1 H1"}; String[][] expected = new String[][]{actual, {"A1 C1 E1 F1 J1", "A1 C1 E1 F1 K1", "A1 B1 G1 H1"}};

1

まず、あなたの代わりに配列のList<>を使用したほうが良いでしょう。

第2に、配列の使用を主張する場合は、独自の「配列包含要素」関数を記述する必要があります。この関数は、配列のメジャーディメンションのループを使用して実装できます。Arrays.equals()メソッドを呼び出すと、2つの1次元配列の内容を比較できます。

0

あなたの文脈でのcollection.IsInの問題は、あなたのリストの要素が配列であり、Array#equalsを使って各要素を比較することです。

具体的

// It will print false, because Array.equals check the reference 
// of objects, not the content 
System.out.println(actual.equals(new String[]{"A1 C1 E1 F1 J1", "A1 C1 E1 F1 K1", "A1 B1 G1 H1"})); 

だから私はJavaからをArrays.equalsを使用するカスタム照合を作成示唆しています。あなたのために配列の内容を比較します。以下のコードのような何か:

public boolean matches(Object item) { 
    final String[] actualStringArray = (String [])item; 

    List<String[]> listOfStringArrays = Arrays.asList(expectedStringMatrix); 

    for (String[] stringArray : listOfStringArrays) { 
     // Arrays.equals to compare the contents of two array! 
     if (Arrays.equals(stringArray, actualStringArray)) { 
      return true; 
     } 
    } 
    return false; 
} 
関連する問題