2016-03-02 48 views
1

是否有可能迫使force assertEquals(String s,Object o)使用o.toString()?

 assertEquals("10,00 €", new Currency(bon.getTotal())) 

使用的toString貨幣對象的()方法? (我不想自己稱呼它。)

因爲否則它比較引用,哪些當然不匹配。

java.lang.AssertionError:

expected: java.lang.String<10,00 €>

but was: jam.cashregister.Currency<10,00 €>

更新

我終於結束了這段代碼:

assertEquals(new Currency(bon.getTotal()), "10,00 €"); 

I don't know if it is a good idea to swap the expected with the actual part, in the assertation.

public class Currency(){ 

    ... 

    @Override 
    public boolean equals(Object other) { 
     return this.toString().equals(other.toString()); 
    } 
} 
+0

是這樣的問題JUnit的assertEquals方法?如果是這樣,你應該添加一個JUnit標籤。 – Ben

+2

你爲什麼不想打電話給自己 - 你想在這裏解決什麼問題? – Ben

+0

唯一的方法是重寫'assertEquals'方法。 – Jens

回答

3

你應該比較Currency兩個實例:

assertEquals(new Currency("10,00 €"), new Currency(bon.getTotal())) 

因此,重新定義equals()是強制性的。如果平等必須基於Currency的字符串表示形式,則也必須覆蓋toString()(您可能已經這樣做了)。

public class Currency { 

    ... 

    @Override 
    public String toString() { 
     //overriden in a custom way 
    } 

    @Override 
    public boolean equals(Object other) { 
     if(other instanceof Currency) { 
      Currency that = (Currency) other; 
      return this.toString().equals(that.toString()); 
     } 
     return false; 
    } 

    ... 
} 
+0

太好了,謝謝。我完全忘記了Object有equals方法,用於比較。 -.- – jam

+0

@jam Btw,我沒有在我的文章中提到它,但是每次'equals()'被覆蓋(反之亦然)時,重寫'hashCode()'是一個好習慣。 :-) – Spotted

+0

爲什麼這是一個好的做法? – jam

1

不,這樣做的唯一辦法就是自己動手寫:

assertEquals("10,00 €", new Currency(bon.getTotal()).toString()); 

編輯:不要偷懶:)

+3

懶惰是程序員的三大美德之一!如果你發現你需要很多東西,那麼編寫你自己的'assertToStringEquals' helper。 – Thilo

相關問題