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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:45:03