1

検証する必要があるmongoのデータがあります:

"items" : [
            {
                    "item" : 0,
            },
            {
                    "item" : 1,
            }
    ],

私のコードには for ループがあります:

for (Object a : getItems()){
 HashMap<?, ?> b = (HashMap<?, ?>)a;
 assertTrue(b.containsValue(0));
}

アイテムの値は 1 と 0 であり、1 も含まれている場合は 2 回目の反復でアサートする必要があるため、ここで問題が発生します。1 と 0 の両方が存在するかどうかを検証するにはどうすればよいですか?

これを行うことができる他の assert メソッドはありますか?

編集:

List lt1 = new ArrayList();
lt1.add(0);
lt1.add(1);
List lt2 = new ArrayList();

for (Object a : getItems()){
 HashMap b = (HashMap)a;
 lt2.add(b.get("item");
}

assertThat(lt2, hasItems(lt1));

これにより、assertThat.. 行で Invocation Target Exception がスローされます。また、JUNIT は以下のようなアサーション エラーを表示します。

Expected : A collection of [0,1]
Got : [0,1]
4

2 に答える 2

2

JUnit を使用しているため、v4.4 の時点で、ライブラリはテスト式を構築するための豊富な DSL を提供するhamcrestマッチャー ライブラリを使用できます。これは、ループを完全に削除して単一のアサーションを記述し、すべての期待値の存在をテストできることを意味します。

たとえば、hamcrest には組み込み関数がありますhasItems()(v1.3.RC2 のドキュメント リンクがありますが、v1.3 は公開されていません。最新のリンクが見つかりませんでした)。

import java.util.List;
import java.util.Arrays;
import static org.hamcrest.Matchers.hasItems;
import static org.junit.Assert.assertThat;

@Test
public void bothValuesShouldBePresent() {
    List<Integer> itemValues = Arrays.asList(new Integer[]{ 0, 1, 2, 3 });
    Integer[] expected = { 0, 1 };
    assertThat(itemValues, hasItems(expected));
}

getItems()もちろん、これは単純な を返すようにメソッドを変更できることを前提としていますList<Integer>

最後に、使用している JUnit のバージョンによって、hamcrest がバンドルされている場合とバンドルされていない場合があります。JUnit は、v4.4 と v4.10 の間で hamcrest-core をインライン化しました。hamcrest-coreだけだったので、プロジェクトにhamcrest-all依存関係を明示的に追加しました。JUnit v4.11 の時点で、hamcrest はインライン化されなくなりました (IMHO の方がはるかに優れています)。そのため、マッチャーを使用する場合は、常に依存関係を明示的に追加する必要があります。

また、hamcrest コレクションのマッチングに関する有用なブログ投稿もここにあります。

編集:

私はあなたが何を返すかを考えようとしgetItems()ましたが、ここに更新されたテスト例があります. 期待される値を配列に変換する必要があることに注意してください-なぜ、このコードが Hamcrest の hasItems コンパイルを使用しようとしないのですか? を参照してください。

@Test
public void bothValuesShouldBePresent() {
    List lt1 = new ArrayList();
    lt1.add(0);
    lt1.add(1);
    List lt2 = new ArrayList();

    List fakeGetItems = new ArrayList() {{ add(new HashMap<String, Integer>() {{ put("item", 0); }}); add(new HashMap<String, Integer>() {{ put("item", 1); }} ); }};

    for (Object a : fakeGetItems) {
     HashMap b = (HashMap)a;
     lt2.add(b.get("item"));
    }

    assertThat(lt2, hasItems(lt1.toArray(new Integer[lt1.size()])));
}
于 2013-01-03T09:03:28.157 に答える
0

これは、AssertJを使用するとはるかに簡単です

@Test
public void bothValuesShouldBePresent1()  {
  List<Integer> lt2 = Arrays.asList(0, 1);
  List<Integer> lt1 = Arrays.asList(0, 1);
  assertThat(lt2).containsExactlyElementsOf(lt1);
}

@Test
public void bothValuesShouldBePresent2()  {
  List<Integer> lt2 = Arrays.asList(0, 1);
  assertThat(lt2).containsExactly(0, 1);
}

@Test
public void bothValuesShouldBePresent3()  {
  List<MyItem> lt2 = Arrays.asList(new MyItem(0), new MyItem(1));
  assertThat(extractProperty("item").from(lt2))
      .containsExactly(0, 1);
}
于 2013-12-20T20:55:40.533 に答える