检查HashMap的值是否正确复制到ArrayList的Java测试返回false



我应该编写一个方法,以List的形式返回HashMap的所有值。

对于上下文,以下是我正在使用的类。Question类是一个类似问答的多选题,它在HashMap中映射了多个答案,键值为(a(、b(、c(等。

Answer具有以下接口:

public class Answer{
private String answerText= "";
private boolean correct;
public Answer(String answerText, boolean correct) {
this.correct = correct;
this.answerText = answerText;
}
...

Question类具有以下接口:

public class Question{
private String text;
private double points;
private HashMap<String, Answer> answers= new HashMap<> ();
public void addAnswer(String id, String text, boolean correct)
answers.put(id, new Answer(text, correct));
}
...

每个问题都有一个text(实际问题(、points(你得到的分数(和HashMap<String, Answer> answers,其中String是答案的关键(a(、b(、c(等等,而Answer是实际答案(所以每个关键对应一个问题(。

现在,我的任务是在Question类中编写一个方法,该方法以列表的形式返回所有答案。我已经为这个方法进行了JUnit测试,下面是测试代码:

@Test
public void testGetListAnswers(){
Question question = new Question("Some question", 2);
question.addAnswer("a", "first answer", true);
question.addAnswer("b", "second answer", false);
List<Answer> answers= question.getListAnswers();
assertAll(
() -> assertEquals(2, answers.size()),
() -> assertTrue(answers.contains(new Answer("first answer", true))),
() -> assertTrue(answers.contains(new Answer("second answer", false))),
() -> assertFalse(answers.contains(new Answer("package", false)))
);
}

这是我写的实际方法:

public List<Answer> getListAnswers() {
ArrayList<Answer> list = new ArrayList<>();
for(Map.Entry<String, Answer> map : answers.entrySet()) {
Answer o =  map.getValue();
list.add(o);
}
return list;
}

我尝试了什么

我写了一个简单的方法,它使用for循环来遍历集合,并简单地将HashMap的每个值添加到ArrayList中。

但是,测试失败了。

您的方法听起来不错。然而,测试断言做

assertTrue(answers.contains(new Answer("first answer", true))

在Listjavadocs中,将以下内容写入包含方法

如果此列表包含指定的元素,则返回true。更多形式上,当且仅当此列表至少包含一个元素e,使得(o==null?e==null:o.equals(e((.

由于它们创建了一个新的Answer实例,并且Answer中没有equals实现,因此调用基类Object中的equals。这将返回false,因为基本的equals方法比较引用。

类Object的equals方法实现了对象上最具区别性的等价关系;也就是说,对于任何非null引用值x和y,当且仅当x和y引用同一对象(x==y的值为true(时,此方法返回true。

如果在Answer中实现并重写equals(和hashCode(方法以比较answerTextcorrect,则测试应通过。

快速相等(由intellij IDEA生成(可能看起来像

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Answer)) return false;
Answer that = (Answer) o;
return correct == that.correct &&
answerText.equals(that.answerText);
}

最新更新