Тест Spring с @DataJpaTest не может автоматически подключать класс к @Repository (но с репозиторием интерфейсов работает!)

Я пытаюсь понять, почему я не могу автоматически подключить репозиторий классов, но могу автоматически подключить репозиторий интерфейса в том же пакете для того же теста. Когда я запускаю приложение, тот же репозиторий работает должным образом.

Во-первых, ошибка:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.app.person.repository.PersonRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultPersonbleBeanFactory.raiseNoMatchingBeanFound(DefaultPersonbleBeanFactory.java:1493)
    at org.springframework.beans.factory.support.DefaultPersonbleBeanFactory.doResolveDependency(DefaultPersonbleBeanFactory.java:1104)
    at org.springframework.beans.factory.support.DefaultPersonbleBeanFactory.resolveDependency(DefaultPersonbleBeanFactory.java:1066)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
    ... 28 more

У меня есть очень простой пример. Тест:

@RunWith(SpringRunner.class)
@DataJpaTest
public class PersonRepositoryTest {

    @Autowired
    private PersonRepository personRepository; // fail...

    @Autowired
    private PersonCrudRepository personCrudRepository; // works!

    @Test
    public void findOne() {
    }
}

Класс репозитория:

@Repository
public class PersonRepository {
    //code
}

Интерфейс репозитория:

@Repository
public interface PersonCrudRepository extends CrudRepository<Person, Long> {
}

После неудачного опыта с той же ошибкой я пытаюсь найти некоторые детали в моей конфигурации или проверить, за что Эта проблема. Другая возможность - @DataJpaTest не поддерживает репозитории классов.


person Dherik    schedule 19.01.2018    source источник
comment
Кстати, не обязательно объявлять аннотацию репозитория в вашем интерфейсе. За кулисами прокси, созданный Spring Data, добавляет этот и даже Transactional   -  person Manuel Jordan    schedule 16.03.2021


Ответы (2)


Думаю, я был прав насчет проблемы. Найдите сообщение на Github и прочтите Документация Spring:

@DataJpaTest можно использовать, если вы хотите протестировать приложения JPA. По умолчанию он настроит встроенную базу данных в памяти, просканирует классы @Entity и настроит репозитории Spring Data JPA. Обычные компоненты @Component не будут загружены в ApplicationContext.

Мой PersonRepository считается обычным @Component, потому что это не репозиторий Spring Data JPA (интерфейс есть). Значит, он не загружен.

Альтернативное решение - использовать @SpringBootTest вместо @DataJpaTest.

Недостаток этого решения заключается в том, что при выполнении теста загружается весь контекст, и при этом отключается срезание теста. Но сделай свою работу.

Другой вариант, все еще использующий @DataJpaTest, - это включить аннотацию фильтра @Repository, например:

@DataJpaTest(includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Repository.class))
person Dherik    schedule 19.01.2018
comment
Привет, я попробовал ваше решение, но у меня остались те же исключения: stackoverflow.com/questions/62313098/ - person user1182625; 11.06.2020
comment
BTW - about Недостаток этого решения заключается в том, что он загружает весь ваш контекст, вы можете использовать SpringBootTest с WebEnvironment.MOCK для тестирования только на стороне сервера (Ничего о Интернете). Это, конечно, в некоторой степени снижает влияние производительности. - person Manuel Jordan; 26.02.2021

Другой альтернативой может быть @Import, как показано здесь https://stackoverflow.com/a/41084739/384674.

person Betlista    schedule 22.02.2018
comment
Да, я думаю, это РЕШЕНИЕ - person GabrielBB; 19.08.2020
comment
Это решило для меня ту же проблему - person AbstractVoid; 03.06.2021