使用@DataJpaTest进行Spring测试不能使用@Repository自动装配类(但是使用接口存储库工作!)

Dhe*_*rik 9 java spring integration-testing spring-data-jpa

我试图理解为什么我不能自动装配类库,但我可以在相同的包中自动装配一个接口存储库以进行相同的测试.当我启动应用程序时,相同的存储库按预期工作.

一,错误:

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
Run Code Online (Sandbox Code Playgroud)

我有一个非常简单的例子.考试:

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

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

    @Autowired
    private PersonCrudRepository personCrudRepository; // works!

    @Test
    public void findOne() {
    }
}
Run Code Online (Sandbox Code Playgroud)

存储库类:

@Repository
public class PersonRepository {
    //code
}
Run Code Online (Sandbox Code Playgroud)

存储库界面:

@Repository
public interface PersonCrudRepository extends CrudRepository<Person, Long> {
}
Run Code Online (Sandbox Code Playgroud)

遇到同样错误糟糕体验后,我试图在配置中找到一些细节或测试导致此问题的原因.另一种可能性是@DataJpaTest不支持类存储库.

Dhe*_*rik 21

我认为我对这个问题是正确的.在Github上找到帖子后阅读Spring文档:

如果要测试JPA应用程序,可以使用@DataJpaTest.默认情况下,它将配置内存中的嵌入式数据库,扫描@Entity类并配置Spring Data JPA存储库.常规@Component bean不会加载到ApplicationContext中.

PersonRepository被认为是常规的@Component,因为它不是Spring Data JPA存储库(接口是).所以,它没有加载.

替代方案是使用@SpringBootTest而不是@DataJpaTest.


Bet*_*sta 15

另一种选择可能@Import如下所示/sf/answers/2875931761/

  • 是的,我认为这就是解决方案 (3认同)