【发布时间】:2025-11-29 14:15:02
【问题描述】:
我有两个集合,我试图在单元测试中比较它们是否相等,但我正在努力使用 contains 方法。这是我所拥有的:
@Test
public void getAllItems() {
Collection<Item> actualItems = auction.getAllItems(joe);
Collection<Item> expectedItems = Lists.newArrayList();
expectedItems.add(iPhone);
expectedItems.add(skateboard);
assertThat(expectedItems, contains(actualItems));
}
items 包含与expectedItems 相同的对象,所以我希望断言是真的,但这是我得到的输出:
[Item{name=iPhone}, Item{name=Skateboard}] --> Expected
[Item{name=iPhone}, Item{name=Skateboard}] --> Actual
java.lang.AssertionError:
Expected: iterable containing [<[Item{name=iPhone}, Item{name=Skateboard}]>]
but: item 0: was <Item{name=iPhone}>
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
请您帮我解决使用contains 方法的问题所在?
public class Item {
private String name;
public Item(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return Objects.toStringHelper(this).add("name", name).toString();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Item other = (Item) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
【问题讨论】:
-
可能有助于查看您的
Item实施。 -
你可能想在 Item 中定义一个 equals 方法。
-
所以您希望您的项目列表包含项目列表?或者您是否希望您的项目列表包含项目?据我所知,
contains是一种可变参数方法,而不是基于Collection→assertThat(expectedItems, contains(items.toArray()));... -
你想多了。应该是
assertThat(actualItems, is(equalTo(expectedItems))。来自@jimjarret 并回答类似的问题:*.com/a/46714949/1215301