Я создаю JUnit TestCase для проекта, который должен загружать файл конфигурации во время инициализации.
Этот файл конфигурации находится внутри проекта в папке src/main/resources/config, а во время сборки maven помещает его в папку /config внутри JAR.
Класс инициализации читает файл с помощью этого оператора:
ClassLoader classloader = this.getClass().getClassLoader();
BufferedReader xmlSource = new BufferedReader(new InputStreamReader(classLoader.getResourceAsStream("/config/config.xml")));
Проблема заключается в том, что когда я развертываю и выполняю эту банку на сервере приложений, она работает так, как ожидалось, однако, всякий раз, когда я запускаю ее в JUnit TestCase в Eclipse, метод getResrouceAsStream возвращает null.
Учитывая, что класс является my.package.MyClassTest.java и что он живет в src/test/java/my/package/MyClassTest.java, я уже попытался поместить копию файла config.xml в следующее папки без успеха:
- src/test/resources/config
- src/test/resources/my/package/config
- src/test/java/my/package/config
Я знаю, что подобные вопросы задавались много раз здесь, в StackOverflow, но все ответы, которые я нашел, касаются изменения способа загрузки файла, и, хотя изменение кода может быть вариантом, я бы предпочел просто найти правильное место для файла, поэтому мне не нужно изменять вещи, которые уже работают в рабочей среде.
Итак, где я должен разместить этот файл, чтобы использовать его в своем тесте JUnit?
UPDATE
Я только придумал решение с небольшим изменением кода: Вместо использования ClassLoader для получения ресурса я непосредственно использовал класс:
Class clazz = this.getClass();
BufferedReader xmlSource = new BufferedReader(new InputStreamReader(clazz.getResourceAsStream("/config/config.xml")));
И он успешно считывает файл из src/test/resources/config/config.xml.
Однако здесь есть что-то очень странное: Метод Class.getResourceAsStream:
public InputStream getResourceAsStream(String name) {
name = resolveName(name);
ClassLoader cl = getClassLoader0();
if (cl==null) {
// A system class.
return ClassLoader.getSystemResourceAsStream(name);
}
return cl.getResourceAsStream(name);
}
И если я его отлаживаю, я ясно вижу, что этот getClassLoader0() возвращает точно такой же объект (тот же идентификатор), что и предыдущий вызов, this.getClass(). getResourceAsStream ( ) (который я сохранил, просто чтобы сравнить значения)!!!
Что здесь происходит?!
Почему вызов метода напрямую не работает, а вставка нового вызова метода между работами?
Честно говоря, я действительно удивлен перед этим.
Кстати, я использую JUnit версии 4.10. Может ли это подменить вызов getClassLoader?
Большое спасибо,
Карлес