Spring 5 MVC MockMvc测试未加载Java配置导致JSON转换失败如何解决
问题核心原因
你当前JUnit测试仅加载了数据访问层的test-context.xml配置,未加载实现了WebMvcConfigurer的MyAppWebAppConfig注解配置类,导致Spring MVC上下文没有注册自定义Jackson JSON转换器,序列化ReturnStatus对象时找不到对应转换器抛出异常。Tomcat运行时web.xml配置的WebApplicationContext会自动加载该Java配置类,因此非测试环境运行正常。
解决方案
方案1:直接在测试注解中同时加载XML和Java配置(推荐,适配集成测试场景)
直接修改@SpringJUnitWebConfig注解的参数,同时指定XML配置路径和Java配置类即可,无需额外改动测试逻辑:
import org.springframework.test.context.junit.jupiter.SpringJUnitWebConfig; import org.springframework.web.context.WebApplicationContext; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; // 同时加载XML配置和WebMvc Java配置 @SpringJUnitWebConfig(locations = "classpath:test-context.xml", classes = MyAppWebAppConfig.class) class YourControllerTest { private MockMvc mockMvc; @Autowired private WebApplicationContext wac; @BeforeEach void initMockMvc() { mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); } // 你的测试用例 @Test void testYourApi() throws Exception { // 测试逻辑 } }
该方案加载的Web上下文和Tomcat正式环境完全一致,配置复用度最高,适合接口集成测试场景。
方案2:测试逻辑中显式注册配置(适配轻量单元测试场景)
如果你不需要加载全量Web上下文,只想做Controller层的轻量单元测试,可以在初始化MockMvc时手动指定消息转换器,无需加载全量配置类:
import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; class YourControllerTest { private MockMvc mockMvc; @BeforeEach void initMockMvc() { // 1. 实例化待测试的Controller YourController targetController = new YourController(); // 2. 实例化你在MyAppWebAppConfig中配置的自定义Jackson转换器 MappingJackson2HttpMessageConverter customJacksonConverter = new MyCustomJacksonConverter(); // 3. 构建MockMvc时手动注入转换器 mockMvc = MockMvcBuilders.standaloneSetup(targetController) .setMessageConverters(customJacksonConverter) .build(); } // 你的测试用例 @Test void testYourApi() throws Exception { // 测试逻辑 } }
该方案不需要加载全量Spring上下文,测试运行速度更快,适合Controller层单元测试场景。
内容的提问来源于stack exchange,提问作者Kode Charlie
相关产品推荐
相关产品推荐

