1

hasItemTestNG とHamcrestを使用して空のコレクションを一致させるにはどうすればよいですか? これは、1回のテストの結果として得られるものです。

java.lang.AssertionError: 
Expected: a collection containing email = null phone = null
got: <[]>

これが私のマッチャークラスです:

private static class MyPersonMatcher extends TypeSafeMatcher<Person> {
   private final String email;
   private final String phone;
      public ContactAgentUsageMatcher() {
   }
   public ContactAgentUsageMatcher(String email, String phone, Integer listingId) {
      this.email = email;
      this.phone = phone;
   }
   @Override
   public void describeTo(Description description) {
      description.appendText("email = ");
      description.appendValue(this.email);
      description.appendText(" phone = ");
      description.appendValue(this.phone);
   }
   @Override
   public boolean matchesSafely(ContactAgentUsage contactAgentUsage) {
      if ((this.email == null) && (this.phone == null)) {
         return true;
      }
      else {
         return ObjectUtils.equals(this.email, contactAgentUsage.getEmail())
             && ObjectUtils.equals(this.phone, contactAgentUsage.getPhone());
      }
   }
}

失敗するテストは

assertThat(argument.getAllValues(), hasItem(expectedMatcher));

expectedMatcher、データ プロバイダーによって提供されます。結果として、この「空のコレクション」と一致させるために何を渡せばよいかわかりません。nullデフォルトのコンストラクターを渡していますが、メンバーでコレクションを作成するため、これが機能しないことはわかっています。

これは私のデータプロバイダーの一部です:

{ new ContactAgentUsageMatcher()}
4

1 に答える 1

2

カスタム マッチャーは、 が構成され、両方が に設定されている場合、既存のものと一致しPersonます。ただし、コレクションには、照合するs が含まれていません。この場合、 Hamcrestはテストに失敗し、空のコレクションに使用するマッチャーとしては不適切です。emailnamenull PersonhasItem(matcher)

以下に 2 つの回避策を示します。

  1. データ プロバイダーとテストを変更して、 を含む完全なマッチャーを取得しますhasItem。上記の場合、 を渡しemptyIterableます。欠点は、Java コンパイラーにどのジェネリック型を使用する必要があるかを伝える必要があることです。これにより、テストが乱雑になります。

  2. 空のコレクションを生成するデータ セットを処理する 2 番目のテストを作成します。

于 2012-09-08T20:45:54.780 に答える