Как установить переменные среды для тестов Junit с Spring Framework - PullRequest
0 голосов
/ 06 октября 2018

У меня есть класс, который просто возвращает переменные окружения с System.getEnv, и я пытаюсь написать для него тест JUnit, но я всегда получаю только ноль.Я пытаюсь использовать application-test.yml со всеми установленными переменными и перепробовал множество аннотаций, таких как

@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(locations="classpath:/application-test.yml")

и многие другие, но все еще безуспешно.Кто-нибудь знает, как это можно сделать просто?

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Есть несколько способов.

Опция 1

Если вы запускаете тесты в вашей IDE (eclipse или IntelliJ IDEA), вы можете установить переменные для тестов в IDE.Если вы используете Maven, вы можете установить Системные свойства через плагин Surefire - https://maven.apache.org/surefire/maven-surefire-plugin/examples/system-properties.html

<project>
[...]
<build>
<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.0</version>
    <configuration>
      <systemProperties>
        <property>
          <name>buildDir</name>
          <value>${project.build.outputDirectory}</value>
        </property>
      </systemProperties>
    </configuration>
  </plugin>
</plugins>
</build>
[...]
</project>

Опция 2

Использование Spring EL

"classpath:config_#{systemProperties['env']}/db.properties" 

Более подробную информацию можно найти здесь - как прочитать Системную переменную среды в Spring applicationContext

0 голосов
/ 06 октября 2018

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

Переменные среды должны существовать в среде.

Итак, у вас есть следующие опции:

Опция 1

Использовать Power Mock, который позволяет имитировать вызовы статических методов.Эта библиотека не является частью Spring, поэтому вы можете просто использовать ее в области тестирования, чтобы она не влияла на производство (jar powermock не будет в списке зависимостей для производства)

Вариант 2

Оберните статические вызовы каким-то внешним классом, а затем смоделируйте его с помощью обычной среды моделирования / или загрузите другой бин того же интерфейса, так как вы все равно используете Spring Test.Код будет выглядеть примерно так:

  interface EnvAccessor {
       String getValue(String envVarName);
  }

  public class MyEnvAccessor {
       String getValue(String envVarName) {
          return System.getenv(envVarName);
       }
  }

Опция 3

Ничего не делать в рабочем коде, но установить программную переменную env до запуска теста JUnit:

public class SampleTest {

    @BeforeClass
    public static void setupEnvironment() {
       // set the environment here
    }
}

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

Вы можете прочитать Здесь о возможных обходных путях и оценке их в вашей программе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...