首页 > 解决方案 > 单元测试存储库spring org.springframework.beans.factory.UnsatisfiedDependencyException

问题描述

  1. 我正在使用 Spring Boot 和 MongoDB 创建一个简单的学校应用程序。我想测试服务类中定义的方法,但出现以下异常:

    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name'com.backintime.BackInTimeSpring.Service.TeacherServiceTest': Unsatisfied dependency expressed through field 'teacherService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying     bean of type 'com.backintime.BackInTimeSpring.Service.TeacherService' available:     expected at least 1 bean which qualifies as autowire candidate. Dependency annotations:    {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    
  2. 我的课程如下:

  3. 存储库:

    package com.backintime.BackInTimeSpring.Model.Repository;
    @Component
    @Repository
    public interface ITeacherRepository extends MongoRepository<Teacher,String> {
    
    @Query("{}")
    Stream<Teacher> findAllTeachers();
    
    List<Teacher> findByLastNameIgnoreCase(String lastName);
    List<Teacher> findByFirstNameIgnoreCase(String firstName);
    
    }
    
  4. 服务:

    package com.backintime.BackInTimeSpring.Service;
    @Component
    @Service
    public class TeacherService {
    @Autowired
    private ITeacherRepository teacherRepository;
    
    public List<Teacher> retrieveAllTeachers(){
        return       this.teacherRepository.findAllTeachers().sorted(Comparator.comparing(Teacher::getLastName)).collect(Collectors.toList());
    }
    public Teacher retrieveTeachersById(String id) {
        return this.teacherRepository.findAllTeachers().filter(t -> t.getId().equals(id)).findFirst().get();
    }
    public List<Teacher> retrieveTeachersByLastName(String lastName){
        return this.teacherRepository.findByLastNameIgnoreCase(lastName);
    }
    public List<Teacher> retrieveTeachersByFirstName(String firstName){
        return this.teacherRepository.findByFirstNameIgnoreCase(firstName);
    }
    public void saveTeacher(Teacher t){
        this.teacherRepository.save(t);
    }
    
    public String greet() {
        return "Hello World";
    }
    

    }

  5. 单元测试:

    package com.backintime.BackInTimeSpring.Service;
    @RunWith(SpringRunner.class)
    @ComponentScan(basePackages = "com.backintime.BackInTimeSpring")
    public class TeacherServiceTest {
    
    @Autowired
    TeacherService teacherService;
    @Test
    public void retrieveAllTeachers() {
        assertEquals(3, teacherService.retrieveAllTeachers().size());
    }
    

标签: javaspringmongodbjunit

解决方案


发生这种情况是因为您@ComponentScan在错误的地方使用。

通常它用于您的主应用程序类或配置类中,而不是您定义 bean 的地方。

请参考此链接:https ://springframework.guru/spring-component-scan/

这里有一个类似的问题,你可以看到它们也在@ComponentScan主应用程序中使用

如何在 SpringJunit4TestRunner 中将 @ComponentScan 与特定于测试的 ContextConfigurations 一起使用?


推荐阅读