Один тестовый метод видит файл в ClassLoader другой нет
Есть два теста:
Первый отрабатывает нормально:
@Test
void shouldReturnValidObjectFromYamlFileInClassLoader() {
final SimplePojo expected = new SimplePojo("value", 1, new int[]{1, 2, 3});
final SimplePojo actual = yamlTransformer.getTransformedObject(FileSource.CLASS_LOADER, "valid.yml", SimplePojo.class);
log.info(actual.toString());
assertEquals(expected, actual);
}
Второй читает из того же ClassLoader, но файла уже не видит:
@Test
void shouldReturnMapFromYamlFileInClassLoader() {
final Map<String, Object> expected = new HashMap<String, Object>() {{
put("string", "value");
put("integer", 1);
put("integerArray", new ArrayList<Integer>() {{
add(1);
add(2);
add(3);
}});
}};
final Map<String, Object> actual = (Map<String, Object>) yamlTransformer.getTransformedObject(FileSource.CLASS_LOADER, "valid.xml", Map.class);
log.info(actual.toString());
assertEquals(expected, actual);
}
Результат второго теста:
YamlFileNotFoundException: File valid.xml not found
Класс валидации наличия файлов, с ним такая же проблема. Ресурса не видит:
public class FileExistenceValidator {
public void validateFileExists(FileSource source, String filename) {
if (source == FileSource.CLASS_LOADER) {
validateFileExistenceInClassLoader(filename);
} else {
validateFileExistenceInFilesystem(filename);
}
}
public void validateFileExistenceInClassLoader(String filename) {
Optional.ofNullable(getClass().getClassLoader().getResource(filename)).orElseThrow(() -> new YamlFileNotFoundException(String.format("File %s not found", filename)));
}
public void validateFileExistenceInFilesystem(String filename) {
if (!Files.exists(Paths.get(filename))) {
throw new YamlFileNotFoundException(String.format("File %s not found", filename));
}
}
}
Ответы (1 шт):
Вызов типа getClass().getClassLoader().getResource(filename) в зависимости от filename ищет ресурс в разных местах.
Если передается имя ресурса типа valid.xml, то оно трактуется, как относительное и ищется в том же пакете, в котором находится класс (тот который вернется getClass), т.е. для класса FileExistenceValidator из пакета dev.demmage.simpleyamlreader файл valid.xml должен лежать в test/java/resources/dev/demmage/simpleyamlreader.
Чтоб получить файл из корня (т.е. в существующей у вас сейчас структуре), нужно доступаться к ресурсу по полному пути в classpath, т.е. /valid.xml.
Тут важно понимать, что структура файлов из test/java/resources или main/java/resource попадает в корень classpath, соответственно файл из test/java/resources находится в корне classpath.
