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)); } }
关键问题点说明
- 类型转换报错根源:你之前把
andExpect直接写在post()方法后面,打乱了链式调用的顺序,正确顺序是先执行perform()发起请求,再链式调用andExpect()做断言验证。 - 请求体缺失问题:你的接口接收
@RequestBody String[] arr参数,测试时必须传递符合JSON数组格式的请求体,否则接口会因参数缺失报错。 - SQL注入风险提示:直接拼接参数到SQL语句是高危操作,使用占位符写法既能避免注入,还能让框架自动处理参数的类型转换和特殊字符转义。
如果需要验证响应体的具体内容,还可以添加jsonPath断言,比如:
.andExpect(jsonPath("$[0].COL1").value("测试COL1值"))
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

