Ich habe ein Singleton/Factory-Objekt, für das ich gerne einen JUnit-Test schreiben würde. Die Factory-Methode entscheidet, welche implementierende Klasse basierend auf einem Klassennamen in einer Eigenschaftendatei im Klassenpfad instanziiert wird. Wenn keine Eigenschaftendatei gefunden wird oder die Eigenschaftendatei den Schlüssel classname nicht enthält, instanziert die Klasse eine implementierende Standardklasse.Verschiedene Klassenlader für verschiedene JUnit-Tests verwenden?
Da die Factory eine statische Instanz des Singleton verwendet, sobald sie instanziiert wurde, um die "Failover" -Logik in der Factory-Methode testen zu können, müsste ich jede Testmethode in einem anderen Classloader ausführen.
Gibt es eine Möglichkeit mit JUnit (oder mit einem anderen Unit-Testpaket), dies zu tun?
edit: hier ist ein Teil der Fabrik Code, der in Gebrauch ist:
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;
}
Singletons führen zu einer ganzen Welt der Verletzung. Vermeiden Sie Singletons und Ihr Code wird viel einfacher zu testen und einfach viel schöner. –