new
一部のコードをリファクタリングしているときに、具象クラスを作成する呼び出しがあることがわかりました。
具体的なクラスを作成するための呼び出しを回避し、テスト容易性を向上させる方法を探していたので、インスタンスを返す役割を担う一種の Factory を作成しました。次に、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;
}
...
}
私が見る唯一のオプションは、Factory タイプのオブジェクトをそのままにしておくことです。つまり、メソッドを静的にしないことです。