Тестовые классы, зависящие от переменных среды - PullRequest
2 голосов
/ 01 октября 2019

У меня есть класс, который зависит от переменной среды. Я хотел бы проверить его с помощью фиктивной переменной среды.

Я думаю, что хорошей структурой было бы внедрить зависимость в Spring Boot, а затем смоделировать ее в тестовой среде. Как мне этого добиться?

Например, с помощью следующего кода:

@Component
public class ProcessorClass implements Processor {

    public String readFile(String fileName) throws IOException {
            String fileOut;
            String path = Environment.getVariable("READ_PATH");
            fileOut = new String(Files.readAllBytes(Paths.get(path + fileName)));
return fileOut

Как бы я ввел READ_PATH так, чтобы потом можно было смоделировать его в JUnit5.

Environment является поддельным классом, который в настоящее время возвращает значение из System.getenv("...")

Спасибо.

Ответы [ 2 ]

4 голосов
/ 01 октября 2019

Используйте вместо этого подделку. Это может быть лучшим вариантом, когда альтернатива является чем-то трудным для насмешки. В вашем случае вы, конечно, можете просто определить переменные тестовой среды, но это может привести к путанице, когда конфигурация разделена на разные места. Не говоря уже о том, что вы не хотите (или не можете) читать любой файл в тестовой среде.

@Component
@Profile("test")
public class ProcessorFake implements Processor {

    // Implement without actually reading from a file
}

@Component
@Profile("qa", "prod", "dev")
public class ProcessorClass implements Processor {
    // Real class used with other profiles
}
1 голос
/ 01 октября 2019

Вы не сказали нам, что это за Environment. Если есть метод Environment.setVariable(), используйте его. Если нет, продолжайте читать.

Environment.getVariable() - статическая глобально доступная функция. Он был создан без какого-либо рассмотрения вопроса о тестировании, и он не подходит для тестирования. Следовательно, он не должен быть частью какого-либо кода, предназначенного для тестирования.

Создайте отдельный компонент, скажем EnvironmentWrapper, задачей которого является просто вызвать Environment.getVariable() и вернуть результат;оставьте этот компонент непроверенным, потому что он не может быть протестирован. Затем в вашем классе ProcessorClass вызовите EnvironmentWrapper, чтобы получить значение переменной. В своем тесте просто смейся над этим классом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...