модульное тестирование с кодом, который зависит от переменной среды - PullRequest
3 голосов
/ 14 июля 2011

У нас есть небольшой набор переменных окружения, которые контролируют поведение нашего приложения.Код приложения находится в Java.(Переменные среды могут быть злыми, но у них есть цель в этом особом случае)

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

Текущее решение - использовать элемент env в задачах junit.Например, ниже

 <env key="BASE_PLUGINS_FOLDER" value="c:/temp"/>

код устанавливает переменную среды для теста.(Это работает, только когда для режима fork установлено значение true)

Это означает, что мне нужно создать несколько разделов теста в файле сборки ant и соответствующий тест в другом месте.Это может стать неуправляемым довольно быстро.

Я чувствую, что может быть лучший способ, это полностью код junit-java.Не уверен как.

Ответы [ 3 ]

8 голосов
/ 15 июля 2011

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

Тогда вы сможете определить две разные реализации:тот, который фактически читает среду (которую вы используете в рабочей среде), и тот, где вы можете сами указать эти значения в Java (который вы используете в своих тестах).

3 голосов
/ 21 июля 2011

Вот взлом, данный моим другом ..

            Class<?> processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment");
        Field theEnvironmentField = processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment");
        theEnvironmentField.setAccessible(true);
        @SuppressWarnings({"unchecked"}) // this will be a Map or the test will fail if Java internals are changed
                Map<String, String> env = (Map<String, String>) theEnvironmentField.get(null);
        env.put(name, val);

        // now System.getenv will return what we want
        //noinspection CallToSystemGetenv
        assertEquals("Problems setting up environment variable for test: " + name, val, System.getenv(name));
1 голос
/ 14 июля 2011

Боюсь, это бесполезный, разочаровывающий ответ ... но подумайте о том, чтобы изменить дизайн приложения, чтобы переопределить переменные среды.

Весь доступ к ним должен быть направлен через одно место, что также будет искать ваш механизм настройки -

или файл свойств,
или файл свойств, на который указывает -D,
или созданный во время выполнения объект конфигурации, переданный настройкой теста,
или дымовые сигналы,
или ...

...