Оригинал
Я пытаюсь загрузить в тесте приложения Spring Boot (v2.3.8) только именованные компоненты в базовом контексте приложения Spring. Более конкретно, я хочу загрузить в тесте контекст приложения Spring, который настраивает, по крайней мере, ведение журнала, загрузку внешних свойств, проверку (через API проверки Java) и @Value
-подключение, но без MVC, JPA данных и т.д. По сути, я хочу протестировать с помощью интерфейса с аннотациями ограничений (например @NotBlank
), а @Service
это использует только локальную файловую систему (без MVC, JPA данных или любого другого "среза" теста загрузки Spring) и имеет один элемент данных, заполненный через @Value
.
Я безрезультатно пробовал множество аннотаций (и некоторые из присущих им атрибутов) в различных комбинациях-подмножествах: например @SpringBootTest
, @Configuration
, @ContextConfiguration
, @TestConfiguration
, @TypeExcludeFilters
и т.д. Например:
@Validated
public interface SomeService {
String someMethod (@NotBlank String someParam);
}
...
@Service
public class SomeServiceImpl implements SomeService {
@Value("${some.value}")
private String someValue;
@Override
public String someMethod(String someParam) {
// do something with local file-system,
// with someValue in hand, and
// knowing someParam not blank
}
}
...
@SpringBootTest(classes={SomeServiceImpl.class},webEnvironment=WebEnvironment.NONE)
class SomeServiceTests {
@Autowired
private SomeService someService;
@Test
void throwConstraintViolationException_whenSomeParamNil() {
assertThrows(
ConstraintViolationException.class,
()->someService.someMethod(new String()));
}
...
}
В этом примере атрибут classes
от @SpringBootTest
загружает указанный класс, но скрывает все основы (ведение журнала, проверка и т. Д.), Которые я также ищу.
Следующий отрывок из книги Крейга Уоллса "Пружинный ботинок в действии", кажется, именно то, что я ищу, но его основной инструмент (@SpringApplicationConfiguration
) теперь устарел (и его официально рекомендованная замена - @SpringBootTest
- не ведет себя одинаково, по крайней мере, в отношении атрибута classes
):
Хотя @ContextConfiguration отлично справляется с загрузкой контекста приложения Spring, он не загружает его с полной загрузкой Spring...SpringApplication не только загружает контекст приложения, но также позволяет вести журнал, загружать внешние свойства (application.properties или application.yml) и другие функции Spring Boot. Если вы используете @ContextConfiguration, вы не получите эти функции. Чтобы вернуть эти функции в свои интеграционные тесты, вы можете заменить @ContextConfiguration на @SpringApplicationConfiguration Spring Boot:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes=AddressBookConfiguration.class)
public class AddressServiceTests {
...
}
Там он получает "полную обработку весенней загрузки", но добавляет только класс (@Service
) он цитирует (не каждый @Component
, @Controller
, и @Repository
его владений).
Как это сделать сегодня, без устаревших @SpringApplicationConfiguration
?
Обновить
Я первоначально заявил, что мой (не Крейга Уоллса) пример (а именно @SpringBootTest(classes={SomeServiceImpl.class},webEnvironment=WebEnvironment.NONE)
, хотя он загрузил указанный класс, скрыл все основы контекста приложения, который обычно загружается при загрузке Spring. В ходе дальнейших экспериментов я обнаружил, что это утверждение было неточным, поскольку не все, а только некоторые основы скрыты, а именно проверка (реализация API проверки Java). Другими словами, ведение журнала, загрузка внешних свойств и подключение @Value действительно загружены/настроены. Я думаю, что я, должно быть, запутался во всех моих многочисленных перестановках/попытках.