当重构一些代码时,我发现我有一个创建具体类的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