【问题标题】:UnsatisfiedDependencyException: Error creating bean with name 'repository.BookRepositoryTest' in Junit TestUnsatisfiedDependencyException:在 Junit 测试中创建名为“repository.BookRepositoryTest”的 bean 时出错
【发布时间】:2020-01-08 03:26:10
【问题描述】:

我正在为 spring 数据存储库编写一个 junit 测试。但我无法自动装配存储库接口。如果我运行 main 方法,程序正在运行,并且 spring 可以检测到所有存储库、服务、实体,但是如果我运行测试它会给出这个错误:

UnsatisfiedDependencyException:创建带有名称的 bean 时出错 'repository.BookRepositoryTest':表示不满足的依赖关系 通过字段“bookRepository”;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 'app.repository.BookRepository' 类型的合格 bean 可用: 预计至少有 1 个 bean 有资格作为 autowire 候选者。 依赖注解: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

@RunWith(SpringRunner.class)
@SpringBootTest(classes={BookRepository.class})
public class BookRepositoryTest
{
    @Autowired
    private BookRepository bookRepository;
    @Test
    public void save()
    {
        Book book=new Book();
        bookRepository.save(book);
    }
}
public interface BookRepository extends JpaRepository<Book,Integer>
{
    Book findByName(String name);
}

项目结构:

src
    main
        java
            app
                entity
                    Book.java
                repository
                    BookRepository.java
                service
                    BookService.java
                App.java
        resources
            application.properties
        webapp
    test
        java
            repository
                BookRepositoryTest.java
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'repository.BookRepositoryTest': Unsatisfied dependency expressed through field 'bookRepository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'app.repository.BookRepository' 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.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:596)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:374)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1411)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:391)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:119)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83)
    at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.prepareTestInstance(SpringBootDependencyInjectionTestExecutionListener.java:43)
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:246)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'app.repository.BookRepository' 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.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1655)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1214)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1168)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593)
    ... 28 more

【问题讨论】:

  • 您似乎缺少上下文中 BookRepository 接口的实现。在您的项目中,implements BookRepository 的课程在哪里,当前课程在哪里?编辑:还是应该被嘲笑?
  • @SpringBootTest中删除classes
  • M.Denium 如果我删除它会给我错误。
  • Kudin 在 spring data 中没有实现存储库接口的类。
  • 看起来像是包扫描问题。你的项目的结构是什么?您的应用程序启动时是否使用 BookRepository 在上下文中自动装配?

标签: java spring spring-boot junit


【解决方案1】:

问题是,您的主包和测试包不同:

BookRepository 位于 app.entity.repository 中,您的测试位于 repository 中。尝试对齐它并将您的测试移动到src/test/java/app/entity/repository

【讨论】:

  • BookRepository 位于 app.repository 而非 app.entity.repository 下。我将测试移动到 src/test/java/app/repository 并且它有效。谢谢,我这几天一直在努力解决这个问题。
  • 我很高兴能帮上忙。请考虑对我的回答进行投票。 :)
  • 如果我尝试运行保存方法,它会再次出现同样的错误。
  • 嗯,如果它工作一次然后突然停止,那就很奇怪了。在移动到不同的包、运行测试(有效)和再次运行之间,你有什么改变?
  • 我处理了。你的答案是正确的。再次感谢您。
【解决方案2】:

您可以通过以下方式使用 BookRepository

@EnableAutoConfiguration
@ContextConfiguration(classes = {BookRepository .class})
public class BookRepositoryTest{
}

【讨论】:

    【解决方案3】:

    我也遇到了类似的问题。我已经使用@MockBean 注解注入了依赖类。

    @MockBean
    private S3StorageService s3StorageService;
    

    上述解决方案对我有用。

    【讨论】:

      猜你喜欢
      • 2020-11-16
      • 2015-06-19
      • 2019-06-15
      • 2020-07-24
      • 2018-01-31
      • 2018-04-07
      • 2021-11-18
      • 2017-05-21
      • 2021-06-20
      相关资源
      最近更新 更多