У меня есть кусок кода Java, который использует переменную среды, и поведение кода зависит от значения этой переменной. Я хотел бы проверить этот код с различными значениями переменной среды. Как я могу сделать это в JUnit?
Я видел несколько способов установить переменные среды в Java в целом, но меня больше интересует аспект модульного тестирования, особенно учитывая, что тесты не должны мешать друг другу.
Ответы:
Библиотека системных правил предоставляет правило JUnit для установки переменных среды.
Отказ от ответственности: я автор Системных Правил.
источник
import org.junit.contrib.java.lang.system.EnvironmentVariables;
Вам нужно будет добавить зависимостьcom.github.stefanbirkner:system-rules
в ваш проект. Это доступно в MavenCentral.Обычным решением является создание класса, который управляет доступом к этой переменной среды, которую вы затем можете смоделировать в своем тестовом классе.
Затем тестируемый класс получает переменную среды, используя класс Environment, а не напрямую из System.getenv ().
источник
В подобной ситуации, как это, где я должен был написать Test Case, который зависит от переменной среды , я попытался сделать следующее:
Я потратил впустую день, используя два вышеупомянутых подхода, но безрезультатно. Тогда Мейвен пришел мне на помощь. Мы можем установить переменные среды или системные свойства через POM- файл Maven, который я считаю лучшим способом выполнить модульное тестирование для проекта на основе Maven . Ниже запись, которую я сделал в файле POM .
После этого изменения я снова запустил Test Cases и вдруг все заработало как положено. Для получения информации читателя, я исследовал этот подход в Maven 3.x , поэтому я понятия не имею о Maven 2.x .
источник
Я думаю, что самый чистый способ сделать это с Mockito.spy (). Это немного легче, чем создавать отдельный класс для насмешек.
Переместите выборку переменной окружения в другой метод:
Теперь в вашем модульном тесте сделайте это:
источник
Я не думаю, что это уже упоминалось, но вы также можете использовать Powermockito :
Дано:
Вы можете сделать следующее:
источник
when(System.getenv("FOO_VAR_1")).thenReturn("test-foo-var-1")
вызываетorg.mockito.exceptions.misusing.MissingMethodInvocationException: when() requires an argument which has to be 'a method call on a mock'.
ошибкуОтсоедините код Java от переменной Environment, предоставляя более абстрактное средство чтения переменных, которое вы реализуете с помощью EnvironmentVariableReader вашего кода для тестирования чтений.
Затем в вашем тесте вы можете дать другую реализацию считывателя переменных, которая предоставляет ваши тестовые значения.
Инъекция зависимости может помочь в этом.
источник
Это ответ на вопрос Как установить переменные окружения из Java? предоставляет способ изменить (неизменяемую) карту в System.getenv (). Таким образом, хотя он НЕ ДЕЙСТВИТЕЛЬНО изменяет значение переменной среды ОС, он может использоваться для модульного тестирования, поскольку он изменяет то, что System.getenv возвращает.
источник
Надеюсь, что проблема решена. Я просто подумал, чтобы сказать свое решение.
источник
Несмотря на то, что я думаю, что этот ответ является лучшим для проектов Maven, он также может быть достигнут с помощью рефлекса (протестировано в Java 8 ):
источник
theCaseInsensitiveEnvironment
а вместо этого имеет полеtheEnvironment
, как показано ниже: `` `envMap = new HashMap <> (); Class <?> Clazz = Class.forName ("java.lang.ProcessEnvironment"); Поле theEnvironmentField = clazz.getDeclaredField ("theEnvironment"); Поле theUnmodifiableEnvironmentField = clazz.getDeclaredField ("theUnmodifiableEnvironment"); removeStaticFinalAndSetValue (theEnvironmentField, envMap); removeStaticFinalAndSetValue (theUnmodifiableEnvironmentField, envMap); `` `Ну, вы можете использовать метод setup (), чтобы объявить различные значения вашего env. переменные в константах. Затем используйте эти константы в методах испытаний, используемых для проверки другого сценария.
источник
Если вы хотите получить информацию о переменной среды в Java, вы можете вызвать метод:
System.getenv();
. В качестве свойств этот метод возвращает карту, содержащую имена переменных в качестве ключей и значения переменных в качестве значений карты. Вот пример:Метод
getEnv()
также может принимать аргумент. Например :Для тестирования я бы сделал что-то вроде этого:
источник
Я использую System.getEnv (), чтобы получить карту, и я сохраняю ее как поле, так что я могу смоделировать ее:
источник