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

SpringBoot中RestController与JdbcTemplate的JUnit测试报错求助

解决Spring MVC + JdbcTemplate的JUnit测试类型转换报错问题

咱们先拆解你遇到的核心问题:测试代码里的MockMvc链式调用语法有误,导致编译器要求强制类型转换;同时你没传递Controller需要的请求体参数,接口调用也会失败。另外你的Controller代码存在SQL注入风险,我顺便一起帮你修正了。

第一步:修正Controller的SQL写法(规避注入风险)

你原来直接拼接参数到SQL里的写法极易引发SQL注入攻击,改成JdbcTemplate的占位符写法更安全可靠:

@Autowired
JdbcTemplate jdbcTemplate;

@RequestMapping(value="/1", method=RequestMethod.POST)
public ResponseEntity<List<Map<String, Object>>> abc(@RequestBody String[] arr) {
    // 使用?作为占位符,让JdbcTemplate自动处理参数绑定,避免SQL注入
    String sql = "select * from Table_Name where COL1=? and COL2=? order by COL3";
    List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, arr[1], arr[2]);
    return new ResponseEntity<>(result, HttpStatus.OK);
}

第二步:修正JUnit测试类的语法与逻辑

你的测试代码存在链式调用顺序错误,而且没传递请求体参数。下面是修正后的完整测试类,我加了详细的注释说明:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = MainClass.class)
@WebAppConfiguration
public class TestWebApplication {
    protected MockMvc mvc;

    @Autowired
    WebApplicationContext webApplicationContext;

    // 加上@Before注解,确保每次测试前都初始化MockMvc实例
    @Before
    public void setUp() {
        mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }

    @Test
    public void testabc() throws Exception {
        // 构造符合接口要求的JSON数组请求体
        String requestBody = "[\"无用占位值\", \"测试COL1值\", \"测试COL2值\"]";

        mvc.perform(post("/1")
                // 传递请求体内容
                .content(requestBody)
                // 指定请求的Content-Type为JSON格式
                .contentType(MediaType.APPLICATION_JSON_UTF8))
                // 断言响应状态码为200 OK
                .andExpect(status().isOk())
                // 断言响应的Content-Type符合预期
                .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8));
    }
}

关键问题点说明

  1. 类型转换报错根源:你之前把andExpect直接写在post()方法后面,打乱了链式调用的顺序,正确顺序是先执行perform()发起请求,再链式调用andExpect()做断言验证。
  2. 请求体缺失问题:你的接口接收@RequestBody String[] arr参数,测试时必须传递符合JSON数组格式的请求体,否则接口会因参数缺失报错。
  3. SQL注入风险提示:直接拼接参数到SQL语句是高危操作,使用占位符写法既能避免注入,还能让框架自动处理参数的类型转换和特殊字符转义。

如果需要验证响应体的具体内容,还可以添加jsonPath断言,比如:

.andExpect(jsonPath("$[0].COL1").value("测试COL1值"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:33:00