JUnit テストを作成したい Singleton/Factory オブジェクトがあります。Factory メソッドは、クラスパス上のプロパティ ファイル内のクラス名に基づいて、どの実装クラスをインスタンス化するかを決定します。プロパティ ファイルが見つからない場合、またはプロパティ ファイルに classname キーが含まれていない場合、クラスはデフォルトの実装クラスをインスタンス化します。
ファクトリはインスタンス化された後に使用するシングルトンの静的インスタンスを保持するため、ファクトリ メソッドで「フェイルオーバー」ロジックをテストできるようにするには、各テスト メソッドを異なるクラスローダーで実行する必要があります。
JUnit (または別の単体テスト パッケージ) でこれを行う方法はありますか?
編集:使用中のFactoryコードの一部を次に示します。
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;
}