JUnit4 (assertEquals) 说对象不同,当它们相同时?

JUnit4 (assertEquals) saying objects are different, when they're the same?

我正在使用 JUnit4 测试我的代码,以查看对象数组 (Word(String a, int b)) 的插入排序是否正确地对数组进行了排序。我遇到的问题是,当我 运行 JUnit 失败时,给我一个错误: "expected {One, 1} but was {One, 1}." 如果我打印出我正在比较的两个值,然后我 运行 测试它们是也一样。代码是:

package sort;

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class InsertionTest {
    private Word word1;
    private Word word2;
    private Word word3;
    private Word word4;
    private Word wordExpected1;
    private Word wordExpected2;
    private Word wordExpected3;
    private Word wordExpected4; 

    @Before
    public void setUp() throws Exception {
        word1 = new Word("One", 1);
        word2 = new Word("Two", 2);
        word3 = new Word("Three", 3);
        word4 = new Word("Four", 4);
        wordExpected1 = new Word("One", 1);
        wordExpected2 = new Word("Two", 2);
        wordExpected3 = new Word("Three", 3);
        wordExpected4 = new Word("Four", 4);
    }

    @After
    public void tearDown() throws Exception {
    }

    @SuppressWarnings("deprecation")
    @Test
    public void test() {
        Word[] wordList = { word3, word2, word4, word1 };
        Word[] expected = { wordExpected1, wordExpected2, wordExpected3, wordExpected4 };
        Insertion.sortInsert(wordList);
        assertEquals(expected, wordList);
    }
}

插入排序代码:

package sort;
public class Insertion {
/**
 * regular insertion sort
 * @param x - the input array containing scores of words that need to be sorted.
 */
    public static void sortInsert ( Word[] x) {
        int N = x.length;

        for (int i = 1; i < N; i++){
            int tempScore = x[i].getScore();
            String tempWord = x[i].getWord();
            int j;

            for (j = (i - 1); j >= 0 && tempScore < x[j].getScore(); j--){
                x[j + 1].setScore(x[j].getScore());
                x[j + 1].setWord(x[j].getWord());
            }

            x[j + 1].setScore(tempScore);
            x[j + 1].setWord(tempWord);
        }
    }
}

ADT 代码:

package sort; 
public class Word implements Comparable<Word>{
    private String word;
    private int score;

    public Word(String w, int s){
        this.word = w;
        this.score = s;
    }

    public int getScore(){
        return score;
    }

    public void setScore(int s){
        score = s;
    }

    public String getWord(){
        return word;
    }

    public void setWord(String w){
        word = w;
    }

    @Override
    public int compareTo(Word w){
        if ((this.score) > (w.score)) { return 1; }
        else if ((this.score) < (w.score)) { return -1; }
        return 0;
    }

    public String toString(){
        return ("{" + this.word + "," + this.score + "}");
    }
}

任何帮助将不胜感激,谢谢!

JUnit 的 assertEquals 取决于您是否正确实施了 Object.equals(Object),而您没有实施。在 Word 中实施 equals(Object) 以完成这项工作。

您正在创建两个不同的对象。仅仅因为它们的属性具有相同的值,它们就不一定相等。为此,您需要覆盖 class Word.

中的 equals() 方法

因此,添加:

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Word other = (Word) obj;
        if (score != other.score)
            return false;
        if (word == null) {
            if (other.word != null)
                return false;
        } else if (!word.equals(other.word))
            return false;
        return true;
    }

Eclipse 提供了一种(半)自动执行此操作的简单方法。打开你的 Word class, select Source -> Generate hashCode() and equals()... Select 检查两个 Word 对象是否相等时应考虑的属性。

此外,您应该选择 hashCode()。 相关问题:

  • Why should I override hashCode() when I override equals() method?
  • What issues should be considered when overriding equals and hashCode in Java?

顺便说一句: 可能是复制和粘贴问题,但未使用 @Override 注释接口中实现的方法(就像您的 compareTo() 一样)。 @Override 注释适用于 toString(),因为您覆盖了 class Object.

toSting() 方法

来自 @Override Javadoc:

Indicates that a method declaration is intended to override a method declaration in a supertype.

使用Lombok 生成equal 和hashcode 方法。然后它会起作用。您的代码也将通过使用 Lombok 注释变得干净。