http://stackoverflow.com/questions/6645263/unit-testing-overridden-methods-which-call-super(這個問題有類似的措辭,但是是不一樣的)如何對超級調用的重寫方法進行單元測試?
我有事沿行:
public class SuperClass {
private int superClassInteger = 2;
public void superClassMethod() {
superClassInteger = 5;
}
public int getSuperClassInteger() {
return superClassInteger();
}
}
然後在我的測試中,我有:
public class SuperClassTest {
public void testSuperClassMethod() {
SuperClass superClass = new SuperClass();
superClass.superClassMethod();
assertEquals(5, super.getSuperClassInteger())
}
}
然後我有一個子類:
public class SubClass {
private int subClassInteger = 2;
public void subClassMethod() {
super.superClassMethod();
subClassInteger = 32;
}
public int getSuperClassInteger() {
subClassInteger;
}
}
然後我的子類測試:
public class SubClassTest {
public void testSubClassMethod() {
SubClass subClass = new SubClass();
subClass.subClassMethod();
assertEquals(5, subclass.getSuperClassInteger());
assertEquals(32, subclass.getSubClassInteger())
}
}
我的問題是,測試子類的行爲,我反覆測試代碼我有超類。我可以拿出:assertEquals(5, subclass.getSuperClassInteger());
,因爲我只是想測試子類的業務邏輯。然而,問題在於如果有人不小心將superClassMethod
的呼叫移除,測試仍然會通過。所以我需要確認是否打了一個超級電話。測試這個用例的常用方法是什麼?
注意:我知道組合/戰略模式vs繼承有助於解決這個問題,但爲了解決這個問題,你基本上說我絕不應該重寫一個方法並在我的代碼中調用super(我很難相信將永遠不會被用於)
這是對大多數情況的合理建議,但有時候,特別是在處理第三方API時,調用'super()'是不可避免的。 (至少沒有很多麻煩) – biziclop
在這種情況下,我想最好是在超級調用之前調用overriden方法中的其他方法,然後測試它們。 – Tarek