1. Введение
В нашем туториале по тестированию в Spring Boot мы увидели, как можно использовать аннотацию @DataJpaTest
.
В следующем уроке мы увидим, как устранить ошибку «Невозможно найти @SpringBootConfiguration
» .
2. Причины
Аннотация @DataJpaTest
помогает нам настроить тест JPA. Для этого он инициализирует приложение, игнорируя ненужные части. Например, он будет игнорировать контроллеры MVC.
Однако для инициализации приложения требуется настройка.
Для этого он ищет в текущем пакете и поднимается вверх по иерархии пакетов, пока не будет найдена конфигурация.
Например, добавим @DataJpaTest
в пакет com.foreach.data.jpa
.
Затем он будет искать класс конфигурации в:
com.foreach.data.jpa
com.foreach.data
- и так далее
Однако, когда конфигурация не найдена, приложение сообщит об ошибке:
Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...)
with your test java.lang.IllegalStateException
Например, это может произойти из-за того, что класс конфигурации находится в более конкретном пакете, таком как com.foreach.data.jpa.application
.
Переместим класс конфигурации в com.foreach.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 .