测试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(...))的语法会触发真实方法调用,而真实方法会校验模板参数,最终抛出异常
修复步骤
- 修正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.");
- 改用doReturn语法处理final方法
由于process是final方法,Mockito的when语法会触发真实方法执行,改用doReturn语法可以避免这个问题:
doReturn("E-posta adresi onaylandı. Bu sayfayı kapatabilirsin.") .when(templateEngine) .process(eq("emailConfirmed"), any(Context.class));
- 覆盖所有测试场景
对于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
相关产品推荐
相关产品推荐

