Ниже вы можете найти пример, который не нуждается в отдельном тестере JUnit и работает также с трюками загрузки классов, такими как Mockito.

я есть объект Singleton / Factory, для которого я хотел бы написать тест JUnit. Метод Factory решает, какой реализующий класс создать, основываясь на имени класса в файле свойств на пути к классам. Если файл свойств не найден или файл свойств не содержит ключ имени класса, тогда класс создаст класс реализации по умолчанию.

Поскольку фабрика сохраняет статический экземпляр Singleton для использования после его создания, чтобы иметь возможность проверить логику «отработки отказа» в методе Factory, мне нужно будет запустить каждый метод тестирования в отдельном загрузчике классов.

Есть ли способ сделать это с помощью JUnit (или другого пакета модульного тестирования)?

edit: вот часть кода 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;
}

Ответы на вопрос(5)

Ваш ответ на вопрос