Один тестовый метод видит файл в 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 шт):

Автор решения: Roman-Stop RU aggression in UA

Вызов типа 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.

→ Ссылка