以下是我需要测试的课程:
package testing;
public class Money {
private int Amount;
private String Currency;
public int getAmount(){return Amount;}
public String getCurrency(){return Currency;}
public Money(int amount, String currency){
Amount= amount;
Currency= currency;
}
public Money addMoney(Money m){
return (new Money(getAmount()+m.getAmount(),getCurrency()));
}
这是我的JUnit测试类
package testing;
import static org.junit.Assert.*;
import org.junit.Test;
public class MoneyTest {
@Test
public void testAddMoney() {
Money m1 = new Money (20,"DH");
Money m2 = new Money(10,"DH");
Money expected = new Money(30,"DH");
Money result = m1.addMoney(m2);
assertTrue(result.equals(expected));
}
@Test
public void testEquals(){
Money m1 = new Money (20,"DH");
Money m2 = new Money(10,"DH");
assertTrue(!(m1.equals(null)));
assertEquals(m1, m1);
assertEquals(m1, new Money(20,"DH"));
assertTrue(!m1.equals(m2));
}
当我运行测试时,它会抛出第一个异常:
java.lang.AssertionError
at testing.MoneyTest.testAddMoney(MoneyTest.jaba:15)15 is the number of line : assertTrue(result.equals(expected));
和第二个:
java.lang.AssertionError at testing.MoneyTest.testEquals(MoneyTest.java:26) 26 is the number of line: assertEquals(m1, new Money(20,"DH"));
有什么问题?
答案 0 :(得分:4)
您 Money 类没有覆盖等于方法,所以
assertTrue(result.equals(expected));
使用对象类中的等于方法,并且2个实例不等于。
在 Money 类上覆盖等于方法,或更改测试
assertEquals(expected.getAmount(), result.getAmount());
答案 1 :(得分:1)
您有两个对象expected
和result
。你知道如果金额和货币相同,这些是平等的,但程序如何知道呢?想象一下Person
课程中包含name
和dob
字段。两个人姓名相同且在同一天出生的人必须由不同的Person
个对象代表。
您的相等规则必须使用Money.equals
方法进行编码,该方法将覆盖默认的Object.equals
方法。
更进一步,您可能希望Money
通过添加Comparable
方法来实现compareTo
界面。然后,您可以自然地对Money
个对象进行排序。
答案 2 :(得分:0)
只需添加,jvm使用hashcode识别对象!! Person类可以有许多具有不同hashcode的实例。只要覆盖Object类的equals(),就可以覆盖Object类的hashcode()。