當重構一些代碼時,我發現我有一個創建具體類的new
調用。當創建一種工廠時避免靜態方法的可測試性
我正在尋找一種避免創建具體類並提高可測試性的方法,因此我創建了一種工廠,負責返回實例。然後,我使用Spring構造函數注入,將工廠注入到被測系統中。
但是現在我面臨一個問題,就是在我的工廠中使該方法變爲靜態,同時具有良好的可測試性。據米斯科Hevery,Static Methods are Death to testability然而,我不知道該怎麼做才能刪除對新的調用,有良好的單元測試,並避免靜態方法調用。
這是使用工廠的類的摘錄。我測試在這個類中的方法利用構造(戲弄)columnFamilyTemplate的:
protected AlertFieldMatcher(ColumnFamilyTemplateBuilder columnFamilyTemplateBuilder, Keyspace keyspace,
T2JsonUtilInterface jsonUtil) {
this.columnFamilyTemplate = columnFamilyTemplateBuilder.build(keyspace, CF_ALERT);
this.jsonUtil = jsonUtil;
}
這是工廠,我現在已經在測試中嘲笑爲方法在SUT(上圖):
public class DefaultColumnFamilyTemplateBuilder
implements ColumnFamilyTemplateBuilder {
@Override
public ColumnFamilyTemplate<String, String> build(Keyspace keyspace,
String columnFamily) {
ColumnFamilyTemplate<String, String> builtTemplate =
new ThriftColumnFamilyTemplate<String, String>
(keyspace,
columnFamily,
StringSerializer.get(),
StringSerializer.get());
return builtTemplate;
}
...
}
我看到的唯一的選擇就是離開我的工廠類型對象的,即不使該方法是靜態的。
你的代碼有什麼問題?爲什麼你要使工廠方法是靜態的?你不應該那樣做(可測試性)的原因是你可以注入*另一個工廠,它實例化一個測試對象,而不是真實的。 –
我在問,因爲我沒有給我的老闆一個強有力的答案,當建議可能使其靜態。保持原樣,就像你說的(我認爲),我能夠模擬DefaultColumnFamilyTemplateBuilder並在我的測試中使用模擬實現。作爲一個靜態我想我不能那樣做。 – Crowie
我也注意到我混合了一些名詞,暗示着已知的Builder模式和一個Factory對象 – Crowie