Я использую 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)}
Мои классы следующие:
Репозиторий:
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);
}
Услуга:
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";
}
}
Модульный тест:
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());
}
Все та же ошибка :(
Бросьте @ComponentScan. Заменить на @SpringBootTest. Обратите внимание на параметры @SpringBootTest, если вам нужно настроить. Обычно можно использовать параметр classes, чтобы указать его на аннотированный основной класс приложения (тот, на котором есть @SpringBootApplication). Также отбросьте @Component в классах, где у вас также есть @Service, потому что @Service импортирует @Component.
Энди .. СПАСИБО, что я решил эту проблему. Я отредактирую код




Это происходит из-за того, что вы используете @ComponentScan не в том месте.
Обычно он используется в вашем классе Main Application или в классах конфигурации, а не там, где вы определяете bean-компоненты.
Пожалуйста, перейдите по этой ссылке: https://springframework.guru/spring-component-scan/
Здесь есть аналогичный вопрос, и, как вы можете видеть, они также используют @ComponentScan в основном приложении.
Как использовать @ComponentScan вместе с тестовыми ContextConfigurations в SpringJunit4TestRunner?
Спасибо, я отредактировал свой код и прочитал документы, но все равно получаю ту же ошибку.
Можете ли вы попробовать аннотировать bean-компонент с помощью @Component и сообщить нам, сработало ли это?