You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot控制器单元测试报错:无法找到UserRepository Bean

问题排查:Spring Boot控制器单元测试Bean找不到异常

异常信息

Field repository in uk.co.circuare.cube.service.user.api.UserController required a bean of type 'uk.co.circuare.cube.service.user.repository.UserRepository' that could not be found.
The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'uk.co.circuare.cube.service.user.repository.UserRepository' in your configuration.

相关代码

主类代码

@SpringBootApplication 
@ComponentScan({
    "uk.co.circuare.cube.service.user",
    "uk.co.circuare.cube.service.user.api",
    "uk.co.circuare.cube.service.api.advice"
}) 
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

RoleControllerTest代码

@WebMvcTest(controllers = RoleController.class)
public class RoleControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ObjectMapper mapper;

    @MockBean
    private RoleRepository repository;
    
}

UserControllerTest代码

@WebMvcTest(controllers = UserController.class)
public class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ObjectMapper mapper;

    @MockBean
    private UserRepository repository;
}

问题原因及解决办法

核心原因

主类手动指定的@ComponentScan扫描范围漏掉了UserRepository所在的uk.co.circuare.cube.service.user.repository包。加上@WebMvcTest是切片测试,只会加载控制器相关Bean,不会自动触发Spring Data的Repository自动配置,导致测试上下文无法识别UserRepository类型的Bean(哪怕是你用@MockBean声明的Mock实例)。

具体解决步骤

任选一种即可:

  1. 删除主类的@ComponentScan:@SpringBootApplication默认会扫描主类所在包及其所有子包,只要主类在uk.co.circuare.cube或更上层包,user.repository作为子包会被自动扫描。修改后主类:
    @SpringBootApplication 
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    
  2. 补充扫描包到@ComponentScan:把uk.co.circuare.cube.service.user.repository加入扫描列表:
    @ComponentScan({
        "uk.co.circuare.cube.service.user",
        "uk.co.circuare.cube.service.user.api",
        "uk.co.circuare.cube.service.api.advice",
        "uk.co.circuare.cube.service.user.repository"
    })
    
  3. 测试类指定加载主类配置:给@WebMvcTest添加classes参数,确保测试上下文加载主类的配置:
    @WebMvcTest(controllers = UserController.class, classes = Application.class)
    public class UserControllerTest {
        // 原有代码保持不变
    }
    

内容的提问来源于stack exchange,提问作者Muhammad Rizwan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:15:42