@SpringBootTest
предназначен для тестирования приложения Spring Boot.Без какой-либо другой конфигурации он ищет класс, аннотированный или мета-аннотированный @SpringBootConfiguration
.Обычно это основной класс вашего приложения, который аннотирован @SpringBootApplication
(который мета-аннотирован @SpringBootConfiguration
. @SpringBootApplication
также мета-аннотирован @EnableAutoConfiguration
, поэтому, когда @SpringBootTest
находит @SpringBootApplication
-аннотированный классавтоконфигурация включена для тестов так же, как и при выполнении самого приложения.
Когда вы пытаетесь протестировать автоконфигурацию, нет класса, помеченного @SpringBootConfiguration
, поэтому вы видите этоошибка:
java.lang.IllegalStateException: невозможно найти @SpringBootConfiguration, необходимо использовать @ContextConfiguration или @SpringBootTest (classes = ...) с вашим тестом
Как вы заметили, вы могли бы решить проблему, пометив PubSubConfig
с помощью @SpringBootApplication
, но вам не следует делать это, так как это библиотека. @SpringBootTest(classes=PubSubConfig.class)
- лучшее решение, поскольку избегает изменения основного кода вашей библиотеки, однакоон по-прежнему не идеален, поскольку @SpringBootTest
действительно нацелен на тестирование приложения Spring Boot, а не на библиотеку, предназначенную для использования в приложении Spring Bootication.
Вместо использования @SpringBootTest
я бы рекомендовал использовать ApplicationContextRunner
.Как следует из названия, он предназначен для запуска контекста приложения.Он предоставляет методы компоновщика для автоконфигурации конфигурации и пользовательской конфигурации, которые следует использовать для создания контекста, настройки свойств и т. Д. Он также предоставляет устанавливаемый контекст приложения, который позволяет легко проверить, что ожидаемые bean-компоненты были и не были определены,Он широко используется в собственных тестах Spring Boot для автоматической настройки.
Вот пример, взятый из собственных тестов Spring Boot для автоматической настройки DataSource
:
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class))
.withPropertyValues("spring.datasource.initialization-mode=never",
"spring.datasource.url:jdbc:hsqldb:mem:testdb-" + new Random().nextInt());
@Test
public void testDefaultDataSourceExists() {
this.contextRunner.run((context) -> assertThat(context).hasSingleBean(DataSource.class));
}