Как установить переменную окружения или системное свойство в весенних тестах?


Я хотел бы написать некоторые тесты, которые проверяют конфигурацию XML Spring развернутой войны. К сожалению, некоторые компоненты требуют, чтобы некоторые переменные среды или свойства системы были установлены. Как я могу установить переменную среды до инициализации spring beans при использовании удобного стиля теста с @ContextConfiguration?

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext { ... }

если я настраиваю контекст приложения с аннотациями, я не вижу крючка, где я могу что-то сделать до того, как контекст spring инициализированный.

5 60

5 ответов:

вы можете инициализировать системное свойство в статическом инициализаторе:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext {

    static {
        System.setProperty("myproperty", "foo");
    }

}

код статического инициализатора будет выполнен до инициализации контекста приложения spring.

правильный способ сделать это, начиная с весны 4.1, чтобы использовать @TestPropertySource Примечание.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
@TestPropertySource(properties = {"myproperty = foo"})
public class TestWarSpringContext {
    ...    
}

смотрите @TestPropertySource в Spring docs и Javadocs.

можно также использовать тестовый ApplicationContextInitializer для инициализации системного свойства:

public class TestApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>
{
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext)
    {
        System.setProperty("myproperty", "value");
    }
}

а затем настроить его в тестовом классе в дополнение к расположению файлов конфигурации контекста Spring:

@ContextConfiguration(initializers = TestApplicationContextInitializer.class, locations = "classpath:whereever/context.xml", ...)
@RunWith(SpringJUnit4ClassRunner.class)
public class SomeTest
{
...
}

таким образом, можно избежать дублирования кода, если для всех модульных тестов должно быть установлено определенное системное свойство.

можно задать системные свойства в качестве аргументов виртуальной машины.

Если ваш проект является проектом maven, то вы можете выполнить следующую команду при запуске тестового класса:

mvn test-Dapp. url="https://stackoverflow.com"

тест класс:

public class AppTest  {
@Test
public void testUrl() {
    System.out.println(System.getProperty("app.url"));
    }
}

Если вы хотите запустить отдельный тестовый класс или метод в eclipse, то:

1) Перейти к Run - > Run Configuration

2) на левой стороне выберите свой тестовый класс в разделе Junit.

3) сделать следующее :

enter image description here

если вы хотите, чтобы ваши переменные были действительны для всех тестов, вы можете иметь application.properties файл в каталоге тестовых ресурсов (по умолчанию:src/test/resources), который будет выглядеть примерно так:

MYPROPERTY=foo

это будет загружаться и использоваться, если у вас нет определения через @TestPropertySource или аналогичный метод-точный порядок загрузки свойств можно найти в главе документации Spring 24. Внешняя Конфигурация.