134

このシグネチャを使用してメソッドを単体テストしたいとします。

List<MyItem> getMyItems();

MyItemは、多くのプロパティを持つ Pojo であると仮定します。そのうちの 1 つは であり"name"、 経由でアクセスされますgetName()

私が確認したいのは、List<MyItem>、または anyに 2 つのインスタンスIterableが含まれており、そのプロパティの値がとであることだけです。他のプロパティが一致しない場合、このテストの目的はあまり気にしません。名前が一致すれば、テストは成功です。MyItem"name""foo""bar"

できればワンライナーでお願いします。これは、私がやりたいことの「疑似構文」です。

assert(listEntriesMatchInAnyOrder(myClass.getMyItems(), property("name"), new String[]{"foo", "bar"});

ハムクレストはこの種のものに適していますか? もしそうなら、上記の擬似構文の hamcrest バージョンは正確には何ですか?

4

9 に答える 9

149

私を正しい方向に向けてくれた@Razvanに感謝します。一行で取得でき、Hamcrest 1.3 のインポートをうまく追い詰めることができました。

インポート:

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.beans.HasPropertyWithValue.hasProperty;

コード:

assertThat( myClass.getMyItems(), contains(
    hasProperty("name", is("foo")), 
    hasProperty("name", is("bar"))
));
于 2012-08-28T21:28:18.883 に答える
55

試す:

assertThat(myClass.getMyItems(),
                          hasItem(hasProperty("YourProperty", is("YourValue"))));
于 2012-08-28T19:45:33.317 に答える
54

特にハムクレストではありませんが、ここで言及する価値があると思います。私が Java8 で頻繁に使用するのは、次のようなものです。

assertTrue(myClass.getMyItems().stream().anyMatch(item -> "foo".equals(item.getName())));

(Rodrigo Manyari のわずかな改善に編集されました。少し冗長です。コメントを参照してください。)

少し読みにくいかもしれませんが、型とリファクタリングの安全性が気に入っています。また、複数の Bean プロパティを組み合わせてテストするのにも優れています。たとえば、フィルター ラムダで Java のような && 式を使用します。

于 2015-10-19T09:50:43.110 に答える
7

Listが具象クラスである限り、MyItemにequals()メソッドを実装している限り、contains()メソッドを呼び出すだけで済みます。

// given 
// some input ... you to complete

// when
List<MyItems> results = service.getMyItems();

// then
assertTrue(results.contains(new MyItem("foo")));
assertTrue(results.contains(new MyItem("bar")));

アサートしたい値を受け入れるコンストラクターを実装したと仮定します。これは1行ではないことはわかっていますが、両方を一度にチェックするのではなく、どちらの値が欠落しているかを知ることは有用です。

于 2012-08-28T19:51:33.950 に答える