JUnit 테스트를 작성하려는 Singleton/Factory 객체가 있습니다. Factory 메소드는 클래스 패스의 속성 파일에있는 클래스 이름을 기반으로 인스턴스화 할 구현 클래스를 결정합니다. 특성 파일이 없거나 특성 파일에 클래스 이름 키가 들어 있지 않으면, 클래스는 기본 구현 클래스를 인스턴스화합니다.다른 JUnit 테스트에 다른 클래스 로더 사용?
factory가 인스턴스화 된 후에 사용할 Singleton의 정적 인스턴스를 유지하기 때문에 Factory 메서드에서 "failover"논리를 테스트하려면 다른 클래스 로더에서 각 테스트 메서드를 실행해야합니다.
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;
}
싱글 톤은 온 세상을 상하게합니다. 싱글 톤을 피하면 코드를 테스트하는 것이 훨씬 쉬워지고 모든 것을 더 멋지게 처리 할 수 있습니다. –