特定のコレクションに特定のアイテムが特定の順序で含まれている場合、Hamcrestを使用して確認するにはどうすればよいですか? hasItems
を試しましたが、順序を無視します。
List<String> list = Arrays.asList("foo", "bar", "boo");
assertThat(list, hasItems("foo", "boo"));
//I want this to fail, because the order is different than in "list"
assertThat(list, hasItems("boo", "foo"));
代わりにcontains
マッチャーを使用できますが、おそらく最新バージョンのHamcrestを使用する必要があります。そのメソッドは順序を確認します。
assertThat(list, contains("foo", "boo"));
順序が重要でない場合は、containsInAnyOrder
を使用して試すこともできます。
それはcontains
マッチャーのコードです:
public static <E> Matcher<Iterable<? extends E>> contains(List<Matcher<? super E>> itemMatchers)
{
return IsIterableContainingInOrder.contains(itemMatchers);
}
コレクションに予想される(指定された)順序でアイテムが含まれていることを確認するには、HamcrestのcontainsInRelativeOrder
メソッドを使用できます。
Javadocから:
Iterableのマッチャーを作成し、検査済みのIterableを1回パスすると、指定したアイテムの対応するアイテムと同じ相対順序で論理的に等しいアイテムを含む一連のアイテムが生成される場合に一致します。例:assertThat(Arrays.asList( " a "、" b "、" c "、" d "、" e ")、containsInRelativeOrder(" b "、" d "))。
実際のJava Hamcrest 2.0.0.0。
お役に立てれば。
このようなカスタムマッチャーを実装する必要があります
class ListMatcher extends BaseMatcher {
String[] items;
ListMatcher(String... items) {
this.items = items;
}
@Override
public boolean matches(Object item) {
List list = (List) (item);
int l = -1;
for (String s : items) {
int i = list.indexOf(s);
if (i == -1 || i < l) {
return false;
}
l = i;
}
return true;
}
@Override
public void describeTo(Description description) {
// not implemented
}
}
@Test
public void test1() {
List<String> list = Arrays.asList("foo", "bar", "boo");
Assert.assertThat(list, new ListMatcher("foo", "boo"));
Assert.assertThat(list, new ListMatcher("boo", "foo"));
}
受け入れられた答えは私のために働いていません。それでも失敗する
Expected: iterable containing ["foo", "boo"] but: Not matched: "bar"
そこで、私は独自のIsIterableContainingInRelativeOrderを作成し、 パッチとして提出 を作成しました。
http://www.baeldung.com/hamcrest-collections-arrays で解決策を見つけました
厳密な順序の例があるセクションを探してください。
List<String> collection = Lists.newArrayList("ab", "cd", "ef");
assertThat(collection, contains("ab", "cd", "ef"));
基本的には、Container Matcher(org.hamcrest.Matchers.contains
)