gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:33:11 25 4
gpt4 key购买 nike

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

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

我的代码中有一个 for 循环:

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

这里有一个问题,因为 items 的值为 1 和 0,如果它也包含 1,我需要对第二次迭代进行断言。如何验证 1 和 0 是否都存在?

还有其他断言方法可以做到这一点吗?

编辑:

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..行抛出一个调用目标异常。此外,JUNIT 显示一个断言错误,如下所示:

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

最佳答案

由于您使用的是 JUnit,as of v4.4该库可以使用 hamcrest匹配器库提供了丰富的 DSL 用于构建测试表达式。这意味着您可以完全删除循环并编写单个断言,测试所有预期值是否存在。

例如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 不再内联(恕我直言,好多了),因此如果您想使用匹配器,您始终需要显式添加依赖项。

另外,这是一个 useful blog post关于 hamcrest 集合匹配。

编辑:

我试着想想你的 getItems()可能会返回,这是一个更新的测试示例。请注意,您需要将预期值转换为数组 - 请参阅 Why doesn't this code attempting to use Hamcrest's hasItems compile?

@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()])));
}

关于java - 如何在for循环中为两个不同的值断言true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14135259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com