Tengo un objeto Singleton/Factory para el que me gustaría escribir una prueba JUnit. El método Factory decide qué clase de implementación instanciar en función de un nombre de clase en un archivo de propiedades en el classpath. Si no se encuentra ningún archivo de propiedades, o si el archivo de propiedades no contiene la clave del nombre de clase, la clase crea una instancia de una clase de implementación predeterminada.¿Usando diferentes clasificadores para diferentes pruebas JUnit?
Como la fábrica conserva una instancia estática de Singleton para usar una vez que se ha instanciado, para poder probar la lógica de "conmutación por error" en el método Factory necesitaría ejecutar cada método de prueba en un cargador de clases diferente.
¿Hay alguna manera con JUnit (o con otro paquete de prueba de la unidad) para hacer esto?
edición: aquí es una parte del código de fábrica que está en uso:
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 conducen a todo un mundo de dolor. Evite los singletons y su código se vuelve mucho más fácil de probar y simplemente más completo. –