【问题标题】:Spring Boot integration test gives error: No qualifying bean of type '.Services.TaskService'Spring Boot 集成测试报错:No qualifying bean of type \'.Services.TaskService\'
【发布时间】:2022-12-12 08:06:44
【问题描述】:

我正在尝试编写测试我的服务类 + 我的存储库的测试。但是当我运行测试时,它会出现以下错误。当我正常运行我的应用程序时,我没有得到它,只有当测试运行时。我不确定出了什么问题,也无法找到适合我问题的解决方案:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name '[PATH].Services.TaskServiceTest': Unsatisfied dependency expressed through field 'taskService'; nested exception is 
    org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.Workethic.Services.TaskService' available: expected at least 1 bean which 
    qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

任务服务

@Service
public class TaskService implements ITaskService {
    @Autowired
    private TaskRepository taskRepository;

    public Task createTask(Task task) {
        return taskRepository.save(task);
    }

    public List<Task> getAllTasks() {
        return taskRepository.findAll();
    }

    public Optional<Task> getTaskById(long id) {
        return taskRepository.findById(id);
    }
}

application.properties(测试/资源/)

spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:file:~/testdb
spring.h2.console.enabled=true
spring.h2.console.path=/console

测试

@DataJpaTest
class TaskServiceTest {
    @Autowired
    private TaskRepository taskRepository;

    @Autowired
    private TaskService taskService;

    @Test
    void createTask() {
        Task task = new Task("bzbz", "some more bzbz");

        Task returnedTask = taskService.createTask(task);

        assert(returnedTask).equals(task);
    }

}

任务.java

@Entity
@Table(name = "tasks")
public class Task {

    @Id
    @Getter
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    @Getter
    @Setter
    public String title;
    @Getter
    @Setter
    private String body;
    @Getter
    @Setter
    @GeneratedValue
    private LocalDateTime created_at;

    public Task(String title, String body) {
        this.title = title;
        this.body = body;
        this.created_at = LocalDateTime.now();
    }

    public Task() {

    }
}

【问题讨论】:

    标签: java spring-boot


    【解决方案1】:

    请删除@DataJpaTest 注释并使用@SpringBootTest 注释或@ContextConfiguration (classes = TaskService.class)

    【讨论】:

    • 在测试中模拟 TaskRepository 而不是自动装配它也是最佳实践吗?
    • 集成测试用例不需要模拟。
    • 对于单元测试用例,模拟依赖关系是有意义的
    猜你喜欢
    • 2022-12-27
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2018-01-02
    • 2019-03-07
    • 2022-12-02
    • 2020-02-25
    相关资源
    最近更新 更多