在重构一些代码时,我发现我有一个new
创建具体类的调用。
我一直在寻找一种方法来避免调用创建具体类并提高可测试性,因此我创建了一种工厂,它负责向我返回一个实例。然后,我使用 Spring 构造函数注入,将工厂注入到被测系统。
但是现在我面临一个问题,即在我的工厂中使该方法成为静态同时具有良好的可测试性。根据 Misko Hevery 的说法,静态方法是可测试性的死亡,但是我不清楚如何删除对 new 的调用,进行良好的单元测试并避免静态方法调用。
这是使用工厂的类的摘录。我在这个类中测试使用构造的(和模拟的)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;
}
...
}
我看到的唯一选择是让我的工厂类型对象保持原样,即不使方法静态。