Spring Boot 3.2.4中@WebMvcTest测试Thymeleaf时HttpServletRequest为空问题
问题解答
不需要手动Mock HttpServletRequest对象,问题根源是Spring Boot 3对@WebMvcTest的自动配置逻辑发生了变化,导致Thymeleaf模板在测试环境中无法正常获取到请求对象。下面给你几个可行的解决办法:
方法1:修改Thymeleaf模板的表达式
把模板中依赖#httpServletRequest的代码替换成Thymeleaf提供的通用#request对象,这个对象在测试和生产环境中都能正常工作:
<a class="nav-link nav-link--header" th:href="@{operations/admin}" th:classappend="${#request.getRequestURI().contains('admin')} ? 'nav-link--active' : ''"> <span class="text-underline">Administration</span> </a>
方法2:在测试类中绑定请求上下文
在你的OperationsControllerTest中,通过RequestContextHolder手动将Mock请求对象绑定到上下文,确保Thymeleaf渲染时能拿到请求信息:
@WebMvcTest(OperationsController.class) public class OperationsControllerTest extends BaseWebTest { @Autowired private MockHttpServletRequest request; @BeforeEach void setUp() { RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); } // 你的测试方法... }
方法3:切换到完整Web环境测试(备选)
如果上述方法都不生效,可以用@SpringBootTest替代@WebMvcTest,启动完整的Web环境来测试,缺点是测试启动速度会变慢:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class OperationsControllerTest extends BaseWebTest { @Autowired private MockMvc mockMvc; // 你的测试方法... }
内容的提问来源于stack exchange,提问作者StefanoSKAL
相关产品推荐
相关产品推荐

