SpringBoot项目ControllerMapper类Junit测试实现问题求助
SpringBoot Controller单元测试问题修复方案
核心问题点
- 错误Mock了待测试的目标类:给
ControllerMapper加了@MockBean注解,相当于用Mock对象替换了Spring上下文里的真实Controller实例,请求不会进入真实业务逻辑,默认仅返回空值 - 缺少Controller依赖的Mock配置:
ControllerMapper中注入的3个Dao实例、DataHandlerController实例都未做Mock处理,@WebMvcTest仅加载Web层相关Bean,不配置Mock的话测试上下文会启动失败 - 未定义Mock方法的返回规则:未指定
dataHandler.fingerIdentification方法调用时的返回值,默认返回null会导致响应内容为空,断言失败
修复后测试代码
@ExtendWith(SpringExtension.class) @WebMvcTest(ControllerMapper.class) public class ControllerMapperIntTest { @Autowired private MockMvc mvc; // Mock Controller所有依赖的外部Bean @MockBean @Qualifier("rng") private Dao<Rng> daoRng; @MockBean @Qualifier("user") private Dao<User> daoUser; @MockBean @Qualifier("fingerprint") private Dao<Fingerprint> daoFingerprint; @MockBean private DataHandlerController dataHandler; @Test public void administrationPage() throws Exception { //given 定义Mock方法的返回值,模拟业务逻辑返回"true" Mockito.when(dataHandler.fingerIdentification( Mockito.any(HttpServletRequest.class), Mockito.any(HttpServletResponse.class), Mockito.eq(daoUser), Mockito.eq(daoFingerprint), Mockito.eq(daoRng) )).thenReturn("true"); //when RequestBuilder request = MockMvcRequestBuilders.get("/finger-identification"); MvcResult result = mvc.perform(request) // 先校验请求响应状态为200 .andExpect(status().isOk()) .andReturn(); //then assertEquals("true", result.getResponse().getContentAsString()); } }
额外优化建议
- 原Controller类中
@Autowired DataHandlerController dataHandler = new DataHandlerController();写法不规范,删除= new DataHandlerController()即可,Spring会自动注入实例,手动new的对象不会被Spring管理,可能导致依赖注入失效 - 类上的
@RequestMapping配置了默认method为POST,和方法上的GET配置不冲突,若无其他POST接口可调整类上的配置减少冗余
内容的提问来源于stack exchange,提问作者Hristo.L
相关产品推荐
相关产品推荐

