JUnit测试:抛出2个异常

时间:2015-03-20 10:56:05

标签: java unit-testing testing junit

以下是我需要测试的课程:

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"));

有什么问题?

3 个答案:

答案 0 :(得分:4)

Money 类没有覆盖等于方法,所以

assertTrue(result.equals(expected));

使用对象类中的等于方法,并且2个实例不等于。

Money 类上覆盖等于方法,或更改测试

assertEquals(expected.getAmount(), result.getAmount());

答案 1 :(得分:1)

您有两个对象expectedresult。你知道如果金额和货币相同,这些是平等的,但程序如何知道呢?想象一下Person课程中包含namedob字段。两个人姓名相同且在同一天出生的人必须由不同的Person个对象代表。

您的相等规则必须使用Money.equals方法进行编码,该方法将覆盖默认的Object.equals方法。

更进一步,您可能希望Money通过添加Comparable方法来实现compareTo界面。然后,您可以自然地对Money个对象进行排序。

答案 2 :(得分:0)

只需添加,jvm使用hashcode识别对象!! Person类可以有许多具有不同hashcode的实例。只要覆盖Object类的equals(),就可以覆盖Object类的hashcode()。