Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

}

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

Ответ 2

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

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

См. @TestPropertySource в Spring docs и Javadocs.

Ответ 3

Можно также использовать тестовый 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
{
...
}

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

Ответ 4

Вы можете установить Системные свойства как аргументы VM.

Если ваш проект - проект 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

Ответ 5

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

MYPROPERTY=foo

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

Ответ 6

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

EnvironmentVariables.html

Быстрый пример из документации, модифицированной для работы с @SpringBootTest

@SpringBootTest
public class EnvironmentVariablesTest {
   @ClassRule
   public final EnvironmentVariables environmentVariables = new EnvironmentVariables().set("name", "value");

   @Test
   public void test() {
     assertEquals("value", System.getenv("name"));
   }
 }

Ответ 7

Для модульных тестов системная переменная еще не создается, когда я выполняю "mvn clean install", потому что на сервере не запущено приложение. Поэтому, чтобы установить свойства системы, мне нужно сделать это в pom.xml. Вот так:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.21.0</version>
    <configuration>
        <systemPropertyVariables>
            <propertyName>propertyValue</propertyName>
            <MY_ENV_VAR>newValue</MY_ENV_VAR>
            <ENV_TARGET>olqa</ENV_TARGET>
            <buildDirectory>${project.build.directory}</buildDirectory>
        </systemPropertyVariables>
    </configuration>
</plugin>