2012-08-28 7 views
70

私はこの署名付きユニットテスト方法にしたいと仮定:Iterableに特定のプロパティを持つ要素が含まれていることをどのようにアサートしますか?

List<MyItem> getMyItems(); 

MyItemgetName()介してアクセス、"name"であるそのうちの一つ、多くの特性を有するPOJOであると仮定する。

私が検証を気にすべての

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

できるだけ1ライナーにしたいと思います。ここで私がやりたいことのいくつかの「擬似構文」があります。

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

このタイプのものには良いでしょうか?もしそうなら、上記の私の擬似構文のhamcrestバージョンはどういうものでしょうか?

答えて

76

ありがとうございます@Razvanは正しい方向に私を指摘しました。私は1行でそれを得ることができ、私は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")) 
)); 
38

試してみてください。

assertThat(myClass.getMyItems(), 
          hasItem(hasProperty("YourProperty", is("YourValue")))); 
+1

サイドノードとして - これはhamcrestソリューション(assertjではありません)です – Hartmut

3

限り、あなたのリストが具象クラスであるとして、あなたは単に限り、あなたはMYITEM上のイコール()メソッドを実装しているとして含まれています()メソッドを呼び出すことができます。

// 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"))); 

アサートする値を受け入れるコンストラクタを実装していることが前提です。これは単なる行ではありませんが、両方を一度にチェックするのではなく、欠けている値を知ることは有益です。

+0

私はあなたのソリューションが本当に好きですが、テストのためにすべてのコードを変更する必要がありますか? –

+0

私はここでのすべての答えは、いくつかのテストセットアップ、テストするメソッドの実行、およびプロパティのアサートを必要とすると考えています。私の答えには実際のオーバーヘッドはありません。ただ、seaprate行に2つのアサーションがあるので、失敗したアサーションでは何が欠けているのかを明確に識別できます。 – Brad

+0

エラーメッセージがよりわかりやすいように、assertTrue内にメッセージを含めることをお勧めします。メッセージがなければ、失敗した場合、JUnitはエラーメッセージなしでAssertionFailedErrorをスローします。だから、 "結果には新しいMyItem(\" foo \ ")が含まれているはずです。 – Max

21

その特にHamcrestませんが、私はここで言及することは価値があると思います。それが少し難しいかもしれ

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

(ロドリゴManyariの若干の改善に編集されたそれは少し冗長のコメントを参照してください。。。)

:私はJava8でかなり頻繁に使用することのようなものです私はタイプとリファクタリングの安全が好きです。 複数のBeanプロパティを組み合わせてテストするのにも便利です。例えばフィルタλ内にjava型のような& &という表現があります。

+2

わずかな改善: assertTrue(myClass.getMyItems()。stream()。anyMatch(item - > "foo" .equal(item.getName )))); –

+0

@RodrigoManyari、閉じ括弧がありません – Abdull

15

Assertjです。

import static org.assertj.core.api.Assertions.assertThat; 

    assertThat(myClass.getMyItems()).extracting("name").contains("foo", "bar"); 

hamcrestに比べてassertjの方が大きなコード補完が容易です。

関連する問題