Загрузка системных свойств для тестов - PullRequest
3 голосов
/ 30 ноября 2010

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

Первый шаг - загрузить контекст тестового приложения:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/applicationContext-test.xml")

Следующий шаг - создать класс, который будет загружать системные свойства:

import java.io.InputStream;
import java.util.Properties;

import javax.annotation.PostConstruct;

import org.springframework.core.io.Resource;

public class SystemPropertiesLoader{

    private Resource resource;

    public void setResource(final Resource resource){
        this.resource = resource;
    }

    @PostConstruct
    public void applyProperties() throws Exception{

        final Properties systemProperties = System.getProperties();

        final InputStream inputStream = resource.getInputStream();

        try{
            systemProperties.load(inputStream);
        } finally{
            inputStream.close();
        }
    }
}

Последний шаг - перечислить это как bean-компонент в контексте моего тестового приложения:

<bean class="com.foo.SystemPropertiesLoader">
    <property name="resource" value="classpath:localdevelopment_Company.properties" />
</bean>

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

Ответы [ 3 ]

3 голосов
/ 30 ноября 2010

Несколько идей:

  1. Если вы проводите модульное тестирование, почему бы не установить требуемые свойства в каждом отдельном тестовом примере.Нет смысла использовать spring для установки глобальной переменной.
  2. Почему вы используете системные свойства.Spring управляет объектами свойств, которые вы можете добавить в свои bean-компоненты.Их можно настроить в appContext.xml, а также инициализировать там (см. PropertyPlaceHolderConfigurer) с помощью системных свойств.Доступ к вашему коду. Свойства системы противоречат самой философии весны.
  3. Настройка системных свойств из файла в любом случае довольно неправильная.Обычно вы используете системные свойства для переопределения настроек в файле свойств.
2 голосов
/ 07 декабря 2010

Проблема была в том, что значения из класса Properties были определены статически. Итак, вот случай, который сломал решение:

  1. Тест А запущен. Тест A не загружает applicationContext-test.xml, но делает вызов в код, который использует значения из класса Properties.
  2. Теперь все значения из класса Properties определены навсегда.
  3. Испытание B запускается. Тест B загружает applicationContext-test.xml.
  4. SystemPropertiesLoader запускается, загружая значения в системные свойства.
  5. Значение извлекается из класса Properties, но, поскольку они были определены статически и были назначены ранее, значения из системных свойств никогда не попадают туда.

В конце концов, лучшим решением было определить значения по умолчанию в классе Properties.

0 голосов
/ 30 ноября 2010

Возможно ли, что каждый из ваших тестовых примеров порождает новую JVM, а свойства System не устанавливаются для каждого тестового случая?

Возможно, попробуйте использовать методы setUp () и tearDown () в вашем тестовом классе JUnit.

...