我需要測試類SportCar,它擴展了汽車的代碼。問題是,當我創建我的對象在測試JMockit:如何避免超的構造
SportCar car = new SportCar();
它還將從父類,例如Car()調用構造函數。這些構造函數做了很多事情,有很多環境依賴關係,並且需要很多我沒有的配置文件,所以我想創建一個SportCar實例而不調用繼承的構造函數。
我知道這個問題的唯一解決方案是創建一個樣機的汽車中,我改寫的構造函數($ INIT)和靜態塊($ clinit)。但現在我的問題是,如果我的層次結構中存在許多類(SportCar擴展Car,擴展了擴展B的C繼承擴展C ...),我想避免所有構造函數,會發生什麼?我應該爲所有以前的課程創建Mocks嗎?
class A extends B{
public A(){
// Plenty of things to avoid during tests
}
}
class Car extends A{
public Car(){
// Plenty of things to avoid during tests
}
}
class SportCar extends Car(){
}
如果你想有一個類跑車不具備汽車類的所有行李,然後沒有從車,就這麼簡單繼承。我覺得Car應該不是一個班級,而是一個界面。 – 2012-02-03 13:22:20
同意@Hovercraft在這種情況下,繼承是邪惡的。改用組合,並實現接口。如果你想「共享邏輯」爲所有的汽車,把它在你注入SportCar(和取其他車需要它)的合作者對象 - 你可以有一個合作者對象的多種實現,這將實現相同的功能,你具有繼承性,但以更簡潔的方式 - 使測試更容易,這通常是良好設計的良好指標。 – Guillaume 2012-02-03 13:30:20
這是舊代碼,我不能改變,但無論如何,我不是說SportCar不需要Car的構造函數的繼承代碼。我只是表示我不想在測試期間調用此代碼。我的意思是,SportCar需要繼承Car的構造函數中的代碼,但因爲我想要一個單獨的(單元)測試,所以我不想在測試過程中調用很多類。無論如何,我知道設計很糟糕:在構造函數中有這樣的事情。有這麼多的依賴關係... – 2012-02-03 13:41:46