1. ホーム
  2. java

[解決済み] ハムクレストのコレクションを比較する

2022-06-25 14:08:26

質問

2つのリストを比較しようとしています。

assertThat(actual.getList(), is(Matchers.containsInAnyOrder(expectedList)));

しかし、アイデア

java: no suitable method found for assertThat(java.util.List<Agent>,org.hamcrest.Matcher<java.lang.Iterable<? extends model.Agents>>)
method org.junit.Assert.<T>assertThat(T,org.hamcrest.Matcher<T>) is not applicable
  (no instance(s) of type variable(s) T exist so that argument type org.hamcrest.Matcher<java.lang.Iterable<? extends model.Agents>> conforms to formal parameter type org.hamcrest.Matcher<T>)
method org.junit.Assert.<T>assertThat(java.lang.String,T,org.hamcrest.Matcher<T>) is not applicable
  (cannot instantiate from arguments because actual and formal argument lists differ in length)

どのように書けばいいのでしょうか?

どのように解決するのですか?

2つのリストが同一であることを主張したいのであれば、Hamcrestで複雑にする必要はありません。

assertEquals(expectedList, actual.getList());

もし本当に順序を無視した比較を行ないたいのであれば、このように containsInAnyOrder varargs メソッドを呼び出し、直接値を提供することができます。

assertThat(actual.getList(), containsInAnyOrder("item1", "item2"));

(リストが String であると仮定すると、むしろ Agent ではなく、この例では)

もし、本当に同じメソッドを List :

assertThat(actual.getList(), containsInAnyOrder(expectedList.toArray(new String[expectedList.size()]));

これがないと、一つの引数でメソッドを呼び出してしまい Matcher にマッチすることを期待する Iterable ここで 各要素 List . にマッチするように使うことはできません。 List .

つまり List<Agent>Matcher<Iterable<List<Agent>> という、あなたのコードで試みられているものです。