«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.