1

Listいくつかの複雑なオブジェクトの順序を返すメソッドをテストする必要があります。簡略化した例:

class MyObject {
    public String foo() { return someString; }
}

私は両方をテストしたいと思います:返されたコレクションの注文可能(今から私はorg.hamcrest.collection.IsIterableContainingInOrder.contains述語を使用して実行していました)。

総括する。私はそのような構文を探しています:

@Test
public void shouldMatchPredicate() {
    List<MyObject> collection = testObject.generate();
    //collection = [myObject#x, myObject#y, myObject#z]
    assertThat(collection, somePredicate("x", "y", "z")
}

デフォルトの1つで、最初の引数はであり、述語の引数はsであるため、containsメソッドは機能していません。その間に何らかの橋が必要です。Collection<MyObject>String

4

2 に答える 2

2

はGuavaオブジェクトであり、HamcrestはGuavaに依存しないためPredicate、。を取るマッチャーはありませんPredicate。また、グアバはハムクレストに依存していないため、マッチャーも提供しません。

述語を取る独自のマッチャーを作成することをお勧めします。これは比較的簡単です。のソースコードを取得し、を取得IsIterableContainingInOrderするように変更しPredicateます。

別のオプションは、次のことを行うことです。

assertThat(Iterables.all(myList, myPredicate), CoreMatchers.is(true));

これは失敗に関する多くのドキュメントを提供しませんが、適切に合格/不合格になります。

于 2012-04-13T11:31:03.397 に答える
1

直接のステートメント を避けて、 MyObjectFactoryinを使用します。の依存関係になります。そうすることで、2つのメリットが得られます。testObject.generate()newMyObjectFactorytestObject

  1. testObjectMyObjectの間の弱い結合は、インターフェースの観点からのみtestObjectわかりますMyObject
  2. モックMyObjectFactoryする可能性、そして最後に、3つの順序付けられた呼び出しをアサートする可能性:MyObjectFactory.BuildNewWithValue("x")MyObjectFactory.BuildNewWithValue("y")およびMyObjectFactory.BuildNewWithValue("z")

単体テストは相互作用テストになります。

返されたコレクション自体をアサートするには、3つのアサートを記述します。

于 2012-04-13T10:05:04.620 に答える