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

测试AuthService.confirmEmail时遇Template cannot be null异常求助

解决单元测试中SpringTemplateEngine抛出"Template cannot be null"异常的问题

你遇到的问题根源有两个:

  • mock的模板名称不匹配:测试代码中你stub的是templateEngine.process("index", ...),但实际业务代码调用的是templateEngine.process("emailConfirmed", ...),导致stub规则不生效
  • final方法的mock方式错误:SpringTemplateEngine的process方法是final方法,使用when(mock.method(...))的语法会触发真实方法调用,而真实方法会校验模板参数,最终抛出异常

修复步骤

  1. 修正stub的模板名称
    将测试中的模板名称从"index"改为实际使用的"emailConfirmed",确保mock规则匹配业务代码的调用:
// 原错误代码
// when(templateEngine.process(eq("index"), any(Context.class))).thenReturn("asdaasdas");
// 修正后
when(templateEngine.process(eq("emailConfirmed"), any(Context.class))).thenReturn("E-posta adresi onaylandı. Bu sayfayı kapatabilirsin.");
  1. 改用doReturn语法处理final方法
    由于process是final方法,Mockito的when语法会触发真实方法执行,改用doReturn语法可以避免这个问题:
doReturn("E-posta adresi onaylandı. Bu sayfayı kapatabilirsin.")
    .when(templateEngine)
    .process(eq("emailConfirmed"), any(Context.class));
  1. 覆盖所有测试场景
    对于confirmEmail方法的其他分支(比如token无效、已确认、过期),也要分别stub对应的模板调用,确保所有路径都能被正确mock:
// 例如处理无效token的场景
when(emailConfirmationService.getToken(anyString())).thenThrow(ResourceNotFoundException.class);
doReturn("Geçersiz token!")
    .when(templateEngine)
    .process(eq("emailConfirmed"), any(Context.class));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 23:35:53