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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:36:03