Активный профиль в SpringBootTest на основе системной переменной - PullRequest
0 голосов
/ 21 декабря 2018

Поскольку хост Redis отличается в локальном и CI, мои @Test могут проходить локально, они не могут проходить в CI.

Во-первых, Я пытался издеваться над RedisTemplate следующим образом:

RedisTemplate redisTemplate = mock(RedisTemplate.class);
ValueOperations valueOperations = mock(ValueOperations.class);
when(redisTemplate.opsForValue()).thenReturn(valueOperations);
when(valueOperations.increment(anyString(), anyLong())).thenReturn(1L);
when(valueOperations.get("a@a.com")).thenReturn("1");

Он издевался RedisTemplate, но не может высмеивать redisTemplate.opsForValue() иvalueOperations.increment(...) (не могу найти причину)

Затем Я написал два профиля с именами application-ci-test.yml и applicaiton-test.yml, попытался активировать один из них на основе системыпеременная окружения

Из здесь я узнаю, что могу установить активный профиль следующим образом:

@Configuration
public class MyWebApplicationInitializer 
  implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {

        servletContext.setInitParameter(
          "spring.profiles.active", "dev");
    }
}

и таким образом:

@Autowired
private ConfigurableEnvironment env;
...
env.setActiveProfiles("someProfile");

Но я не знаю, как их использовать.Системная переменная может получить System.getenv(..).Итак, теперь я хочу знать, как активировать профиль на основе полученной переменной.

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Используйте параметры запуска внутри вашего задания / скрипта CI.

В зависимости от того, как вы запускаете свои тесты, вы можете, например, сделать это с аргументами виртуальной машины

mvn test -Dspring.profiles.active=ci-test

или

java -jar -Dspring.profiles.active=ci-test

или любым другим.

С другой стороны, вы можете использовать программные аргументы:

java -jar --spring.profiles.active=ci-test

Так или иначе, если активный профиль при запуске активирует файл свойств по вашему выбору.

Если вы хотите, чтобы какой-то определенный фрагмент кода (например, класс конфигурации) выполнялся только с определенным профилем, аннотируйте этот фрагмент кода с помощью @Profile("ci-test")

Пример:

@Configuration
@Profile("ci-test")
public class SomeConfiguration {
   //any configuration beans etc.
}

Следующий класс будет загружен только тогда, когда Ваш активный профиль будет "ci-test".Поэтому, если вы запустите приложение на своем CI-сервере с помощью одной из приведенных выше команд, будет загружен как файл свойств с именем «ci-test», так и этот класс конфигурации.

Стоит также добавить, что для запуска некоторого кода во ВСЕХ профилях, КРОМЕ указанного, вы можете отменить имя внутри аннотации профиля, например: @Profile("!ci-test").

Код с комментариями будет работать со всеми профилями (включая стандартные), кроме "ci-test".

0 голосов
/ 25 декабря 2018

Я нашел способ активировать соответствующий профиль на основе системной переменной или свойства:

import org.springframework.test.context.ActiveProfilesResolver;

public class SpringActiveProfileResolver implements ActiveProfilesResolver {
    @Override
    public String[] resolve(Class<?> testClass) {
        final String isCITest = System.getEnv("isCITest");
        return new String[] { isCITest == null ? "test" : "ci-test" };
    }
} 

, затем используйте параметр resolver в @ActiveProiles:

@ActiveProfiles(resolver = SpringActiveProfileResolver.class)

Как установитьПеременная окружения является другой проблемой, и ответы выше уже ответили на нее

0 голосов
/ 21 декабря 2018

Предполагая, что ваши методы @Test находятся в классе с аннотацией @SpringBootTest, вы можете использовать @ActiveProfiles для установки профиля.

@SpringBootTest
@ActiveProfiles("someProfile")
...