В приложении 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.
Проблема связана с порядком жизненного цикла приложения 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;
}
}
Обратите внимание, что тестовый класс не изменился.
Я выполнил вышеуказанный тест и могу видеть профиль, который он выполнил, как и ожидалось, «еда».
Как получается, что вы запускаете тест с профилем food
, а логи активного профиля foo
?
Хорошо работает, спасибо.