私は、JUnitテストを記述したいSingleton/Factoryオブジェクトを持っています。 Factoryメソッドは、クラスパス上のプロパティファイル内のクラス名に基づいて、どの実装クラスをインスタンス化するかを決定します。プロパティファイルが見つからない場合、またはプロパティファイルにクラス名キーが含まれていない場合、クラスはデフォルトの実装クラスをインスタンス化します。異なるJUnitテストに異なるクラスローダーを使用していますか?
ファクトリメソッドで "フェイルオーバー"ロジックをテストできるようにするために、Factoryがインスタンス化された後で使用するSingletonの静的インスタンスを保持しているので、別のクラスローダーで各テストメソッドを実行する必要があります。
JUnit(または他のユニットテストパッケージ)にはこれを行う方法はありますか?
編集:ここで使用されている工場のコードの一部です:
private static MyClass myClassImpl = instantiateMyClass();
private static MyClass instantiateMyClass() {
MyClass newMyClass = null;
String className = null;
try {
Properties props = getProperties();
className = props.getProperty(PROPERTY_CLASSNAME_KEY);
if (className == null) {
log.warn("instantiateMyClass: Property [" + PROPERTY_CLASSNAME_KEY
+ "] not found in properties, using default MyClass class [" + DEFAULT_CLASSNAME + "]");
className = DEFAULT_CLASSNAME;
}
Class MyClassClass = Class.forName(className);
Object MyClassObj = MyClassClass.newInstance();
if (MyClassObj instanceof MyClass) {
newMyClass = (MyClass) MyClassObj;
}
}
catch (...) {
...
}
return newMyClass;
}
private static Properties getProperties() throws IOException {
Properties props = new Properties();
InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(PROPERTIES_FILENAME);
if (stream != null) {
props.load(stream);
}
else {
log.error("getProperties: could not load properties file [" + PROPERTIES_FILENAME + "] from classpath, file not found");
}
return props;
}
シングルトンは世界中の傷つきを引き起こします。シングルトンを避けて、コードをテストするのがずっと簡単になり、全面的に面白くなります。 –