Java 如何为for循环中的两个不同值断言true?

Java 如何为for循环中的两个不同值断言true?,java,mongodb,junit,assert,Java,Mongodb,Junit,Assert,我在mongo中有需要验证的数据: "items" : [ { "item" : 0, }, { "item" : 1, } ], 我的代码中有一个for循环: for (Object a : getItems()){ HashMap<?, ?> b = (HashMap<?, ?>)a

我在mongo中有需要验证的数据:

"items" : [
            {
                    "item" : 0,
            },
            {
                    "item" : 1,
            }
    ],
我的代码中有一个for循环:

for (Object a : getItems()){
 HashMap<?, ?> b = (HashMap<?, ?>)a;
 assertTrue(b.containsValue(0));
}
这会在assertThat.处引发调用目标异常。。线路。 此外,JUNIT显示了一个断言错误,如下所示:

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

因为您使用的是JUnit,所以该库可以使用matcher库,它为构建测试表达式提供了丰富的DSL。这意味着您可以完全删除循环并编写一个断言,测试是否存在所有预期值

例如,hamcrest有一个内置功能(v1.3.RC2的文档链接,但v1.3已过期-抱歉,找不到最新的链接)

这是很容易的

@测试
public void两个值都应该存在1(){
List lt2=Arrays.asList(0,1);
listlt1=Arrays.asList(0,1);
(lt2)包含(lt1)实际要素的资产;
}
@试验
public void两个值都应该存在2(){
List lt2=Arrays.asList(0,1);
资产(lt2)。实际包含(0,1);
}
@试验
public void两个值都应该存在3(){
List lt2=Arrays.asList(新的MyItem(0),新的MyItem(1));
资产(从(lt2)中提取财产(“项目”)
.实际包含(0,1);
}

这取决于是否创建哈希映射。您可以使用一个哈希映射,其中一个键映射到一个列表,然后断言该列表同时包含0和1。由于键相同,我认为最后一个值将替换上一个值。我建议你使用一个“项目”列表,而不是一张地图(或者让钥匙独一无二)是的,没错。我不能让钥匙独一无二。我可以制作一个列表,添加0和1。但是,如何在每次只取1个值的for循环中验证它们呢?我想我已经成功了!谢谢@peterlawreytanks的帮助。我试着用两个列表来描述这个。列表a具有[0,1],列表b具有相同的值。但是,当我断言(a,hasItems(b))时,我会得到一个调用目标异常。有什么解决方案吗?没有可能很难回答的确切错误和源代码。你能添加例外的前几行作为评论吗?另外,你能不能在我的答案中添加一个简单的测试到你的代码中,看看这是否有效?我已经用正在编辑的新代码编辑了我自己的问题。你能看一下吗?我已经用一个更进一步的例子更新了我的答案,希望对你有所帮助。我无法重现您看到的确切错误,因为我无法访问
getItems()
函数。
Expected : A collection of [0,1]
Got : [0,1]
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));
}
@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()])));
}
@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);
}