«1. Введение
В нашем руководстве по тестированию в Spring Boot мы увидели, как мы можем использовать аннотацию @DataJpaTest.
В этом следующем уроке мы увидим, как устранить ошибку «Не удалось найти @SpringBootConfiguration».
2. Причины
Аннотация @DataJpaTest помогает нам настроить тест JPA. Для этого он инициализирует приложение, игнорируя ненужные части. Например, он будет игнорировать контроллеры MVC.
Однако для инициализации приложения требуется настройка.
Для этого он ищет в текущем пакете и идет вверх по иерархии пакетов, пока не будет найдена конфигурация.
Например, добавим @DataJpaTest в пакет com.baeldung.data.jpa. Затем оно будет искать класс конфигурации в:
-
com.baeldung.data.jpa com.baeldung.data и т. д.
Однако, если конфигурация не будет найдена, приложение сообщит об ошибке: ~~ ~
Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...)
with your test java.lang.IllegalStateException
Это может произойти, например, из-за того, что класс конфигурации находится в более конкретном пакете, таком как com.baeldung.data.jpa.application.
Переместим класс конфигурации в com.baeldung.data.jpa. В результате Spring теперь сможет его найти.
С другой стороны, у нас может быть модуль без @SpringBootConfiguration. В следующем разделе мы рассмотрим этот сценарий.
3. Отсутствует @SpringBootConfiguration
Что делать, если наш модуль не содержит @SpringBootConfiguration? Тому может быть несколько причин. Предположим для этого руководства, что у нас есть модуль, содержащий только классы моделей.
Итак, решение простое. Давайте добавим @SpringBootApplication в наш тестовый код:
@SpringBootApplication
public class TestApplication {}
Теперь, когда у нас есть аннотированный класс, Spring может запустить наши тесты.
Чтобы проверить нашу настройку, давайте внедрим TestEntityManager и подтвердим, что он установлен:
@RunWith(SpringRunner.class)
@DataJpaTest
public class DataJpaUnitTest {
@Autowired
TestEntityManager entityManager;
@Test
public void givenACorrectSetup_thenAnEntityManagerWillBeAvailable() {
assertNotNull(entityManager);
}
}
Этот тест завершается успешно, когда Spring может найти @SpringBootConfiguration в своем собственном пакете или в одном из своих родительских пакетов.
4. Заключение
В этом кратком руководстве мы рассмотрели две разные причины ошибки: «Не удалось найти @SpringBootConfiguration».
Сначала мы рассмотрели случай, когда не удалось найти класс конфигурации. Это произошло из-за его расположения. Мы решили эту проблему, переместив класс конфигурации в другое место.
Во-вторых, мы рассмотрели сценарий, в котором класс конфигурации не был доступен. Мы решили эту проблему, добавив @SpringBootApplication в нашу тестовую кодовую базу.
Как всегда, полный исходный код статьи доступен на GitHub.