当前位置: 首页 > 知识库问答 >
问题:

使用@datajpatest的Spring测试不能自动使用@repository的类(但使用interface repository可以工作!)

公孙霖
2023-03-14

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

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个答案

仉联
2023-03-14

我想我对问题的看法是对的。在Github上找到一个帖子并阅读Spring文档后:

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

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

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

另一个选择仍然使用@datajpatest,它包含一个@repository过滤器注释,如下所示:

@DataJpaTest(includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Repository.class))
 类似资料:
  • 问题内容: 我试图理解为什么我不能自动装配类存储库,但可以自动装配 同一程序包 中的接口存储库以进行 相同的测试 。启动应用程序时,相同的存储库可以按预期工作。 一,错误: 我有一个非常简单的例子。考试: 存储库类: 存储库接口: 在经历了与此相同的错误的糟糕经历之后,我试图在我的配置中找到一些详细信息,或者测试导致此问题的原因。另一种可能性是不支持类存储库。 问题答案: 我认为我对这个问题是正确

  • 我正试图为一个java spring项目编写一个集成测试。在代码中的某个时候,我需要检查客户。getId(),其中ID由如下注释创建:(请记住,Customer\u ID是我的自动递增主键) 我使用lombok生成getter和setter方法。我的测试数据库是H2,我使用Junit5进行测试。我面临的问题是,我无法测试getId()行为,因为当我用DataJpaTest注释测试时,它总是0。我使

  • 我有一个Spring Boot应用程序,其中包含一个Spring数据Jpa存储库。我需要运行一个单元(或组件?)围绕此存储库进行测试。我对Spring数据Jpa没有太多经验。 这是我的测试。它非常简单,我无法通过。 这是其他相关的源代码。 和 我只是想把Jpa回购协议自动连接到测试中,但我做不到。很明显,我误解了Spring Boot工作原理的一些细微差别。但即使经过了一些教程,我也无法找出我遗漏

  • 我试图测试一个@Controller类,其中有来自POJO的列表。我可以在另一个@RESTController类中使用@Autowired来连接控制器,但在同样的情况下,我不能将其用于测试。 user.java UserContrell3.java 在下一个类中,userresource.java我可以做@autowired 但是,在测试类UserTest.java中。我不能: 提前感谢!

  • 我想检查一堆URL是否正常工作。因此,我编写了一些代码(如下所示)来实现这一点。它适用于像谷歌这样的网站。通用域名格式。当我把它应用到我的场景中时,它失败了。 我正在登录虚拟机。从这个虚拟机,我可以在浏览器中打开所需的URL。当我尝试检查是否可以用代码连接到URL时,它失败了。我的代码从文件中获取的URL是正确的,可以在浏览器上运行。因此,排除了URL中的错误。 我的服务器URL如下所示- 如何调

  • 我不能使用spring boot 2.1.0.M4和Junit5和测试我的spring crud存储库。我正在使用下面的spring crud存储库接口。 这是我的单元测试类 这是我的pom.xml 我只想知道成功运行测试的正确注释集是什么。我尝试使用不同的组合 如果我只是使用@datajpatest和@runwith(Springrunner.class),我会得到以下错误: 附言。只想提一下,