2011-10-28 72 views
4

我正在開發一個Java項目,其中有一個ant build,它運行由Cobertura監視的JUnit測試。這很好,我們的覆蓋率非常高。對於一些類,比如Hibernate實體,我們只有最少的代碼,但有equals和hashCode方法。測試這些是一個巨大的痛苦,並降低了覆蓋率。我們試過使用EqualsVerifier兩個類互相引用,這經常發生在Hibernate實體中。Java代碼覆蓋思路?

我們考慮過使用Commons EqualsBuilder,但是後來我們失去了讓IDE自動生成equals/hashCode方法的能力。我知道EqualsBuilder也可以通過反射來完成,但是我們不希望僅僅爲了構建時單元測試覆蓋而失去運行時性能。

一個理想的情況是,如果我們能告訴Cobertura忽略equals和hashCode方法,但那些補丁需要我們註釋我們的類,這看起來有點尷尬。

所以,我希望從別人的想法,在這種情況下,什麼效果很好。有沒有人有任何想法如何做到這一點?

謝謝!

回答

5

在我看來,你需要做出決定:equals和hashCode並不重要,在這種情況下,你應該忽略100%的代碼覆蓋率度量(或者說明如何忽略一個方法)。或者他們很重要,你應該寫單元測試來鍛鍊它們。它可能不好玩,但聽起來像你在乎這些方法是否正常工作。在這種情況下,您可能需要測試它們。

+0

我同意所有代碼都應該測試。心理掙扎是與那些測試的手動編碼。在這種情況下,equals方法是自動生成的,並且是正確的。所以,測試是對所用算法的測試。涉及的分支數量非常多,因此測試將是一系列將事物設置爲某個對象的組合,或者將null包含在每個分支的每一側。 也許最後最適合我的事情是將補丁提交給EqualsVerifier以允許引用彼此的類。 –

+0

它們在創建時是'正確'的,但是在某人向對象添加另一個成員變量後它們是否正確?那會是我擔心的事情。 –

1

如果不值得測試,那麼首先編寫代碼可能不值得。換句話說:如果你的equals和hashcode方法被用在你的產品代碼中的任何地方,那麼你需要代碼覆蓋範圍。就如此容易。否則會導致錯誤。相信我,它

順便說一下,「測試這些是一個巨大的痛苦」永遠不應該成爲足以放棄測試的理由。巨大的痛苦通常會轉化爲現在的巨大努力,但長期來看是值得的。