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 注释变得干净。
我正在使用 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 注释变得干净。