gpt4 book ai didi

java - 使用 hamcrest contains() 方法比较两个集合

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:05:38 27 4
gpt4 key购买 nike

我有两个集合,我试图在我的单元测试中比较它们是否相等,但我正在努力使用 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;
}

}

最佳答案

集合的.contains(...) 使用对象的equalshashCode 方法。为了在您自己的对象上使用equals(或在本例中为contains),您需要覆盖equalshashCode 类的方法。这是因为 Java 在幕后使用引用,因此即使字段可能相等,对象引用却不同。

在 Eclipse 中,您可以使用鼠标右键单击 -> Source -> Generate hashCode() and equals()...。但是,由于您从未声明过使用 Eclipse,因此这里是生成的方法示例:

// Overriding this class' equals and hashCode methods for Object comparing purposes 
// using the Collection's contains
// contains does the following behind the scenes: Check if both inputs aren't null,
// check if the HashCodes match, check if the Objects are equal.
// Therefore to use the Collection's contains for Objects with the same fields, we
// need to override the Object's equals and hashCode methods
// These methods below are generated by Eclipse itself using "Source -> Generate
// hashCode() and equals()..."
@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 类中,contains 将起作用。


编辑:

我不确定,但是当我查看您的代码时,我认为以下内容可能是错误的:

@Test
public void getAllItems() {

Collection<Item> actualItems = auction.getAllItems(joe);
Collection<Item> expectedItems = Lists.newArrayList();

// You first print both lists
System.out.println(expectedItems);
System.out.println(items);

// And then add the two items to the expectedItems
expectedItems.add(iPhone);
expectedItems.add(skateboard);
assertThat(expectedItems, contains(actualItems));
}

如果您改为尝试以下操作:

@Test
public void getAllItems() {

Collection<Item> actualItems = auction.getAllItems(joe);
Collection<Item> expectedItems = Lists.newArrayList();

// First add both items
expectedItems.add(iPhone);
expectedItems.add(skateboard);

// Then print both lists
System.out.println(expectedItems);
System.out.println(items);

assertThat(expectedItems, contains(actualItems));
}

expectedList 现在是否包含 4 个项目?

[Item{name=iPhone}, Item{name=Skateboard}, Item{name=iPhone}, Item{name=Skateboard}]  --> Expected
[Item{name=iPhone}, Item{name=Skateboard}] --> Actual

在这种情况下,您不应添加这两项,因为它们已经存在于列表中。

此外,您正尝试在整个列表中使用 contains。通常 contains 用于查看列表中是否存在单个项目。所以你可以使用这样的东西:

for(Item i : expectedList){
assertTrue(actualList.contains(i));
}

or perhaps something like this, in case you use these libraries :

assertThat(actualList, is(expectedList));

我不确定这是否是原因以及这是否会解决问题,因为您使用的 JUnit 库与我通常使用的不同,而且我不确定这些带有断言的语法是否可行。

关于java - 使用 hamcrest contains() 方法比较两个集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25385058/

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