복붙노트

[SPRING] @DataJpaTest로 Spring 테스트는 @Repository로 클래스를 autowire 할 수 없습니다 (하지만 인터페이스 저장소가 작동합니다!).

SPRING

@DataJpaTest로 Spring 테스트는 @Repository로 클래스를 autowire 할 수 없습니다 (하지만 인터페이스 저장소가 작동합니다!).

나는 왜 내가 클래스 저장소를 autowire 할 수 없는지에 대해 이해하려고 노력하고있다. 그러나 같은 테스트를 위해 동일한 패키지에 인터페이스 저장소를 autowire 할 수있다. 동일한 저장소가 응용 프로그램을 시작할 때 예상대로 작동합니다.

첫째, 오류 :

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가 클래스 리포지토리를 지원하지 않는다는 것입니다.

해결법

  1. ==============================

    1.나는 그 문제에 대해 내가 옳았다 고 생각한다. Github에서 게시물을 찾은 후 Spring 설명서를 읽습니다.

    나는 그 문제에 대해 내가 옳았다 고 생각한다. Github에서 게시물을 찾은 후 Spring 설명서를 읽습니다.

    Spring Data JPA 저장소가 아니기 때문에 PersonRepository는 일반 @Component로 간주됩니다 (인터페이스는). 따라서로드되지 않습니다.

    대안은 @DataJpaTest 대신 @SpringBootTest를 사용하는 것입니다.

  2. ==============================

    2.또 다른 대안은 https://stackoverflow.com/a/41084739/384674에 나와있는 @Import 일 수 있습니다.

    또 다른 대안은 https://stackoverflow.com/a/41084739/384674에 나와있는 @Import 일 수 있습니다.

  3. from https://stackoverflow.com/questions/48347088/spring-test-with-datajpatest-cant-autowire-class-with-repository-but-with-in by cc-by-sa and MIT license