Spring MVC中含@RequestParam参数的控制器方法测试用例编写方法
如何为带@RequestParam的Spring MVC控制器方法编写测试用例?
首先,先把你给出的原控制器代码贴出来,方便咱们对照:
@RequestMapping(value = "/url",method = RequestMethod.GET) public @ResponseBody String methodName(@RequestParam(value="data[]") int[] data, @RequestParam Integer Id){ int id = Id; for (int i = 0; i < data.length; i++) { System.out.println(data[i]); } return "success"; // 补充返回值,让@ResponseBody更合理,也方便测试断言 }
接下来,最常用的测试方式是用Spring提供的MockMvc来模拟HTTP请求,它能帮咱们在不启动服务器的情况下,精准测试控制器的请求处理逻辑。下面分步骤给你讲怎么写:
一、Spring Boot项目基础测试类编写
Spring Boot项目可以用@WebMvcTest注解,它会只加载Web层相关的Bean,不用启动整个Spring上下文,测试效率更高。
import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.web.servlet.MockMvc; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; // 替换成你实际的控制器类名 @WebMvcTest(YourController.class) public class YourControllerTest { // 自动注入MockMvc,用来模拟HTTP请求 @Autowired private MockMvc mockMvc; @Test public void testMethodName_WithValidParams() throws Exception { // 模拟GET请求,传递数组和单个参数 mockMvc.perform(get("/url") // 传递数组参数:多次调用param,每个值对应数组的一个元素 .param("data[]", "1", "2", "3") // 传递Id参数 .param("Id", "100")) // 验证请求返回的状态码是200 OK .andExpect(status().isOk()); } }
二、验证业务逻辑(比如控制台输出)
如果想验证控制器里的循环打印逻辑是否正确,可以通过捕获System.out的输出来做断言:
import java.io.ByteArrayOutputStream; import java.io.PrintStream; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.web.servlet.MockMvc; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.junit.jupiter.api.Assertions.assertEquals; @WebMvcTest(YourController.class) public class YourControllerTest { private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); private final PrintStream originalOut = System.out; @Autowired private MockMvc mockMvc; // 测试前替换System.out,捕获输出内容 @BeforeEach public void setUpStreams() { System.setOut(new PrintStream(outContent)); } // 测试后恢复原System.out,避免影响其他测试 @AfterEach public void restoreStreams() { System.setOut(originalOut); } @Test public void testMethodName_ChecksConsoleOutput() throws Exception { mockMvc.perform(get("/url") .param("data[]", "1", "2", "3") .param("Id", "100")) .andExpect(status().isOk()); // 验证控制台输出是否符合预期(每个元素换行打印) String expectedOutput = "1\n2\n3\n"; assertEquals(expectedOutput, outContent.toString()); } }
三、测试参数缺失的场景
你的Id参数是Integer类型(没有设置required = false),所以如果不传这个参数,应该返回400错误,咱们可以写个测试用例验证这个场景:
@Test public void testMethodName_MissingIdParam() throws Exception { mockMvc.perform(get("/url") .param("data[]", "1", "2")) // 验证返回400 Bad Request状态码 .andExpect(status().isBadRequest()); }
四、传统Spring MVC项目的测试方式
如果不是Spring Boot项目,需要手动构建MockMvc实例:
import org.junit.jupiter.api.Test; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; public class YourControllerTest { private MockMvc mockMvc; @Test public void testMethodName() throws Exception { // 初始化控制器实例,手动构建MockMvc YourController controller = new YourController(); mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); // 后续的请求模拟和断言和之前一致 mockMvc.perform(get("/url") .param("data[]", "1", "2") .param("Id", "50")) .andExpect(status().isOk()); } }
内容的提问来源于stack exchange,提问作者Semantic
相关产品推荐
相关产品推荐

