在Java/Junit中,我需要使用某個對象測試null。有多種方法可以測試一個條件,但我一直在使用assertTrue來進行大多數測試。當我檢查assertTrue中的空值時,EclEmma聲明它只測試一個分支。當使用assertTrue而不是assertNull時缺少分支
當我手動將語句解析爲變量(如將結果設置爲布爾值並將其傳遞到assertTrue中)時,代碼覆蓋率在斷言中被認爲是完整的,但在變量初始化行上沒有。
這是怎麼發生的?這是否與在http://sourceforge.net/apps/trac/eclemma/wiki/FilteringOptions上提到的Java顯然增加的額外字節代碼有關?任何解決方案(除了使用其他斷言語句)。
assertTrue:
assertTrue(myObject == null); //1 of 2 branches
assertTrue:
boolean test = (myObject == null); //1 of 2 branches missing
assertTrue(test); // complete
assertNull:
assertNull(myObject) //complete;
什麼是錯的使用assertNull斷言空?對所聲稱的東西使用適當的斷言類型通常會更好。如果測試失敗,您最好查看出了什麼問題,而不要在測試代碼中進行過多的挖掘。 – nansen 2012-04-13 18:23:48
@nansen這是真的,我沒有問題,使用assertNull,如果它是一個要求,但是,IMO,所有斷言「類型」只是另一種形式的assertTrue。使用不同的斷言類型,如增加的錯誤信息/可讀性,可能會有額外的好處,但這不是真正的問題。 – 2012-04-13 18:30:26
@nansen這並不是說我拒絕使用assertNull並且可能會使用它,我只是發現這個特殊的問題很有趣,因爲我基本上是在測試相同的東西,但Emma給出了完全不同的結果。 – 2012-04-13 18:31:24