使用@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


答案 1

我认为我对这个问题的看法是正确的。在Github上找到一篇文章并阅读Spring文档后:

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

My被认为是一个常规的,因为它不是Spring Data JPA存储库(接口是)。因此,它未加载。PersonRepository@Component

另一种解决方案是使用 代替 。@SpringBootTest@DataJpaTest

此解决方案的缺点是,它将在运行测试时加载所有上下文,并禁用测试切片。但要做好这份工作。

另一个仍在使用 的选项是包含筛选器注释,如下所示:@DataJpaTest@Repository

@DataJpaTest(includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Repository.class))

答案 2

另一种选择可能如图所示 https://stackoverflow.com/a/41084739/384674@Import


推荐