Как я могу использовать профиль Spring при использовании @SpringBootTest?

В приложении Spring Boot у меня есть этот сервис:

@Service
@RequiredArgsConstructor
public class Foo {

    @Value("${spring.profiles.active:}")
    private String activeProfile;

    public boolean stuff() {
        System.out.println("Active profile: " + activeProfile);
        return true;
    }
}

Когда я запускаю приложение с помощью -Dspring.profiles.active=bar и вызываю метод stuff(), в журнале отображается Active profile: bar, как и ожидалось.

У меня есть пример тестового класса, который выглядит так:

@SpringBootTest
@ActiveProfiles("foo")
public class FooTest {

    @Autowired
    private Foo foo;

    @Test
    void fooTest() {
        assertTrue(foo.stuff());
    }
}

Когда я запускаю этот тест, в журнале не отображается активный профиль (Active profile : ).

Почему @ActiveProfiles("foo") не работает в этом случае?

Моя конечная цель состоит в том, чтобы некоторые из моих классов SpringBootTest проходили некоторый код, а другие — нет, без добавления параметра метода boolean test.

Версия Spring Boot — 3.3.2.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема связана с порядком жизненного цикла приложения Spring: активные профили применяются позже, чем вставка значений в поля с аннотациями @Value.

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

   @Service
   @RequiredArgsConstructor
   public class Foo {

    private final Environment env;

    public boolean stuff() {
        String[] activeProfiles = env.getActiveProfiles();
        System.out.println("Active profiles: " + String.join(", ", activeProfiles));
        return true;
    }
}

Обратите внимание, что тестовый класс не изменился.

Хорошо работает, спасибо.

ThCollignon 23.08.2024 10:43

Я выполнил вышеуказанный тест и могу видеть профиль, который он выполнил, как и ожидалось, «еда».

Как получается, что вы запускаете тест с профилем food, а логи активного профиля foo ?

ThCollignon 23.08.2024 10:40

Другие вопросы по теме