我有一个单例/工厂对象,我想写一个JUnit测试。 Factory方法根据类路径上的属性文件中的类名决定要实例化哪个实现类。如果没有找到属性文件,或者属性文件不包含classname键,那么该类将实例化一个默认实现类。对不同的JUnit测试使用不同的类加载器吗?
由于工厂保留了一个实例化的单例的静态实例,为了能够在Factory方法中测试“故障转移”逻辑,我需要在不同的类加载器中运行每个测试方法。
是否有任何方式与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;
}
单身人士导致整个世界受到伤害。避免单身人士,你的代码变得更容易测试,而且更好。 – 2008-09-05 15:42:11