Как установить глобальные переменные среды при модульном тестировании - PullRequest
4 голосов
/ 01 апреля 2020

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

Я уже добавил переменные среды в конфигурацию теста следующим образом:

Однако, похоже, это не так использоваться на всем проекте. Следовательно, классы, вызывающие переменные этой среды, возвращают нуль. Как мне сделать мой модульный тест и классы, которые он вызывает, для использования глобально объявленных переменных среды? ТИА. Ниже приведен фрагмент моего кода того, как мои переменные окружения используются в классе

@Value("${fintech.clientid}")
private String clientId;
@Value("${fintech.secret}")
private String clientSecret;
@Value("${digifi-host}")
private String fintechHost;
@Value("${fintech-digifi-login-endpoint}")
private String loginUrl;
@Value("${fintech-single-session-endpoint}")
private String singleSessionUrl;

. Это происходит из класса, он вызывает значения, хранящиеся в моем файле application.properties. А из файла application.properties он пытается найти правильные значения в переменных среды, объявленных во время выполнения.

So from Java Class > application.properties file/config > Runtime Environment Variables 

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

enter image description here

PS: я уже нашел соответствующие статьи в stackoverflow, но все они относятся к классу тестирования c, и в нем используются верные плагины или настройка переменные окружения или через pom, но мне не нужно, чтобы они были там, поскольку для нас требуется использовать переменные окружения во время выполнения, так как значения переменных должны быть скрыты и не видны в коде. Мне просто нужно, чтобы весь проект использовал глобальную переменную среды, когда он выполняет свой модульный тест. Очень похоже на то, как мой проект будет использовать переменные окружения, которые я установил в IDE в обычном режиме.

Только для справки. Я уже сделал ff.:


A.

@ClassRule
public final static EnvironmentVariables environmentVariables = new EnvironmentVariables().set("property1", "value1");

B.

@ContextConfiguration(locations = "classpath:application.properties")
public class LoginServiceTest {
...
}

C.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>  
      <environmentVariables>
        <SERVER_PORT>8082</SERVER_PORT>
      </environmentVariables>
    </configuration>
</plugin>

D.

@TestPropertySource(properties = {"property1=value1","property2=value2",})
public class LoginServiceTest {
...
}

E.

public class LoginServiceTest {    
static{
      System.setProperty("property1", "value1");
      System.setProperty("property2", "value2");            
...
}

1 Ответ

0 голосов
/ 01 апреля 2020

ОБНОВЛЕНИЕ:

Это решение работало на всех моих тестах. Подробнее см. Здесь.

@RunWith(SpringRunner.class)  //Add this
@SpringBootTest(classes = Application.class)   //Add this
public class LoginServiceTest {
...
}

Затем в Run> Редактировать конфигурации> Шаблоны (в боковом меню)> JUnit enter image description here

enter image description here

  1. Затем поместите все переменные среды здесь.
  2. Нажмите «+» в верхнем левом окне и нажмите «Применить».
  3. Затем удалите все существующие команды модульного теста в своей конфигурации и приступите к повторному повторному запуску всего теста.
  4. Затем вы увидите, что переменные окружения автоматически добавляются во все ваши новые и будущие юнит-тесты.

    Вам не нужно будет вручную добавлять переменные окружения в каждую команду модульного теста, как я раздражал раньше. Если у вас когда-нибудь будет обновление ваших переменных среды. Удалите конфигурацию основного модульного теста, которую необходимо обновить, и обновите шаблон JUnit, чтобы изменения отразились на новых модульных тестах, которые могут у вас быть.

PS:

Дело в том, что я все еще сталкивался с той же самой проблемой в некоторых из моих модульных тестов, что даже при том, что переменные среды читаются правильно во время выполнения и в некоторых модульных тестах в порядке с вышеупомянутыми конфигурациями. Только во время других многочисленных модульных тестов те же самые переменные среды не извлекаются или не принимаются классами должным образом. Сначала я думал, что мои классы на самом деле не получают правильные переменные среды, и должно быть что-то не так в том, как я хранил переменные среды в IntelliJ, чего на самом деле не было, но оказалось, что этот формат кода, который у меня есть, является проблемой.

@Value("${fintech.clientid}")
private String clientId;
@Value("${fintech.secret}")
private String clientSecret;
@Value("${digifi-host}")
private String digifiHost;

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

Поэтому я возился с этими конкретными кодами до Я уже смог получить правильные переменные среды на модульном тесте. Обратитесь к изменениям из кода выше к тому, который исправил проблему для меня ниже.

@Value("${fintech.clientid}")
public void getClientId(String tempClientId) {
    clientId = tempClientId;
}
private  String clientId;

@Value("${fintech.secret}")
public void getClientSecret(String tempClientSecret) {
    clientSecret=tempClientSecret;
}
private  String clientSecret;

@Value("${digifi-host}")
public void getDigifiHost(String tempDigifiHost) {
    digifiHost=tempDigifiHost;
}
private  String digifiHost;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...