Spring Boot+Mybatis MockMvc测试报错:需配置sqlSessionFactory或sqlSessionTemplate
解决Spring MockMvc测试时抛出
Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required异常 这个问题我之前也碰到过,本质是测试环境下MyBatis Mapper的注入逻辑没处理对,结合你用的Spring Boot + MyBatis Starter技术栈,给你几个针对性的解决方案:
1. 切换到完整上下文测试(适合需要真实Mapper操作的场景)
如果你需要在测试中调用真实的Mapper逻辑,不要单独使用@WebMvcTest注解——它只会加载控制器层的Bean,不会初始化MyBatis相关的SqlSessionFactory、SqlSessionTemplate等核心组件,导致Mapper无法注入。
正确的做法是用@SpringBootTest结合@AutoConfigureMockMvc,这样会加载完整的Spring上下文,包括MyBatis的配置:
@SpringBootTest @AutoConfigureMockMvc public class YourControllerTest { @Autowired private MockMvc mockMvc; @Autowired private YourMapper yourMapper; // 现在可以正常注入Mapper @Test public void testControllerWithRealMapper() throws Exception { // 先通过Mapper准备测试数据 yourMapper.insertTestData(new TestData()); // 执行接口测试 mockMvc.perform(get("/api/your-endpoint")) .andExpect(status().isOk()) .andExpect(jsonPath("$.code").value(200)); } }
2. Mock掉Mapper依赖(适合仅测试控制器逻辑的场景)
如果你只想测试控制器的请求处理、参数校验等逻辑,不需要调用真实的数据库操作,可以用@MockBean注解模拟Mapper,避免触发MyBatis的初始化流程:
@WebMvcTest(YourController.class) public class YourControllerTest { @Autowired private MockMvc mockMvc; @MockBean private YourMapper yourMapper; // 用Mockito模拟Mapper @Test public void testControllerLogic() throws Exception { // 预设Mapper的返回值 when(yourMapper.getById(anyLong())).thenReturn(new TestData(1L, "test")); // 执行接口测试 mockMvc.perform(get("/api/your-endpoint/1")) .andExpect(status().isOk()) .andExpect(jsonPath("$.data.name").value("test")); } }
3. 检查MyBatis基础配置是否正确
除了测试注解的问题,还要确认项目本身的MyBatis配置没问题:
- 启动类上是否添加了
@MapperScan("com.yourpackage.mapper"),确保Mapper接口被扫描到; application.yml/application.properties中是否配置了mybatis.mapper-locations,指定Mapper XML文件的位置(比如classpath:mapper/*.xml);- 确认
mybatis-spring-boot-starter1.3.2和你的Spring Boot版本兼容(1.3.2对应Spring Boot 1.5.x系列,版本不匹配也可能导致初始化失败)。
按照上面的步骤调整后,应该就能解决这个异常,顺利完成控制器测试了。
内容的提问来源于stack exchange,提问作者Longshi Shen
相关产品推荐
相关产品推荐

