Репозиторий модульного тестирования 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());
    }
    

Можете ли вы попробовать аннотировать bean-компонент с помощью @Component и сообщить нам, сработало ли это?

OEH 11.12.2018 12:00

Все та же ошибка :(

Wat Als 11.12.2018 12:39

Бросьте @ComponentScan. Заменить на @SpringBootTest. Обратите внимание на параметры @SpringBootTest, если вам нужно настроить. Обычно можно использовать параметр classes, чтобы указать его на аннотированный основной класс приложения (тот, на котором есть @SpringBootApplication). Также отбросьте @Component в классах, где у вас также есть @Service, потому что @Service импортирует @Component.

Andy Brown 11.12.2018 16:23

Энди .. СПАСИБО, что я решил эту проблему. Я отредактирую код

Wat Als 12.12.2018 10:09
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
187
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это происходит из-за того, что вы используете @ComponentScan не в том месте.

Обычно он используется в вашем классе Main Application или в классах конфигурации, а не там, где вы определяете bean-компоненты.

Пожалуйста, перейдите по этой ссылке: https://springframework.guru/spring-component-scan/

Здесь есть аналогичный вопрос, и, как вы можете видеть, они также используют @ComponentScan в основном приложении.

Как использовать @ComponentScan вместе с тестовыми ContextConfigurations в SpringJunit4TestRunner?

Спасибо, я отредактировал свой код и прочитал документы, но все равно получаю ту же ошибку.

Wat Als 11.12.2018 11:38

Другие вопросы по теме