MockMvc单元测试的参数传递

本文详细介绍了使用MockMvc进行单元测试时如何传递参数,包括模拟表单提交和JSON格式的数据传递,通过具体示例展示了RequestParam与RequestBody注解的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MockMvc单元测试的参数传递

MockMvc的参数传递

简单的介绍下用法

比如要模拟前端传送过来3个参数
username
password
age

UserController添加一个用户

@Autowired
UserService userService;
public void insertUser(@RequestParam @Validated String username, String password, String age){
Integer row=userService.insert(username, password, age);
if (row>0){
System.out.println(“添加成功”);
} else {
System.out.println(“添加失败”);
}
}
这里用到了2个注解:
1、@RequestParam ( org.springframework.web.bind.annotation.RequestParam)
2、@Validated ( org.springframework.validation.annotation.Validated)
请看到最后再去百度注解

@Test
public void insertTest() throws Exception {
    String loginName = "text";
    String password= "123456";
    String age = "30";
    RequestBuilder request = MockMvcRequestBuilders.post("/user/adduser")
            .contentType(MediaType.APPLICATION_FORM_URLENCODED)
            .param("loginName",loginName)
            .param("password",password)
            .param("age ",age );

    MvcResult mvcResult = mvc.perform(request).andReturn();
    int status = mvcResult.getResponse().getStatus();
    
    System.out.println("返回状态码:" + status);
}

语法:mockMvc.perform(MockMvcRequestBuilders.请求方式(“url”).contentType(MediaType.APPLICATION_FORM_URLENCODED).param(“键”,“值”);

和上面例子里的对比一下大家应该稍微明白怎么用了(还看不懂的我只能说开发不适合你)
上面这个例子是模拟表单提交的

下面再介绍一个JSON格式的,毕竟现在是一套后台,N个前端,下面例子用到了FastJson

@Test
public void insertTest() throws Exception {
	UserEntity user=new UserEntity();
    user.setLoginName("test");
    user.setPassword( "123456");
    user.setAge("30");
    String jsonStr=JSON.toJSONString(user);
    RequestBuilder request = MockMvcRequestBuilders.post("/user/adduser")
            .accept(MediaType.APPLICATION_JSON_UTF8)
            .contentType(MediaType.APPLICATION_JSON_UTF8)
            .content(jsonStr);

    MvcResult mvcResult = mvc.perform(request).andReturn();
    int status = mvcResult.getResponse().getStatus();
    
    System.out.println("返回状态码:" + status);
}

你以为完了?当然没有,因为,我们要修改很多东西,UserController中方法的参数,Service层,实现类,给人的感觉就是,这不是等于没有解耦么,前后端的交互方式在项目开始就要定下来,现在前后端分离基本都是采用的json进行数据传递,所以我推荐第二种方法,无非就是多几个DTO类(啥事DTO类?不懂去百度吧)

public void insertUser(@RequestBody @Validated UserEntity user){
	Integer row=userService.insert(user);
	if (row>0){
		System.out.println("添加成功");
	} else {
		System.out.println("添加失败");
	}
}

这里将@RequestParam替换为了@RequestBody

至于注解,我就不在说了,请去百度,有详细的专门介绍的,我今天只给大家介绍介绍MockMvc的参数传递。

最后说明,只是给刚接触MockMvc的人,用最简单方式,拿来就用。

<think>好的,我现在需要帮助用户解决如何为Controller编写单元测试的问题,并且提供示例代码。首先,我应该回顾用户的问题和提供的引用内容,确保回答准确且有参考依据。 用户明确提到想查找关于Controller单元测试的方法或示例,特别是如何编写单元测试以及示例代码。他们之前可能已经了解过一些测试的重要性,如引用[1]中提到的测试对系统健壮性和开发效率的帮助,以及引用[2]、[3]、[4]中关于Spring Boot单元测试的具体示例和实战经验。 首先,我需要确定用户的技术栈。根据引用内容,用户可能在使用Spring Boot框架,因此示例代码应该基于Spring Boot的测试框架。接下来,我需要考虑Controller单元测试的关键点,比如如何模拟HTTP请求、验证响应状态码、响应内容以及处理异常情况。 然后,我需要参考引用中的示例。例如,引用[2]提到使用mockMvc.perform发送GET请求,并用andExpect验证状态码和内容。引用[3]中的测试案例覆盖了Controller的特定分支,这说明测试需要模拟不同的场景,如返回null或异常情况,以确保所有分支都被覆盖。 接下来,我应该规划回答的结构,确保清晰易懂。可能的结构包括:测试前的准备工作、基本测试方法、模拟依赖、验证响应体和异常处理。每个部分都需要结合代码示例,并引用相关的参考资料。 同时,需要确保代码示例符合用户的要求,比如使用Java和Spring Boot的测试框架,正确使用注解如@SpringBootTest、@AutoConfigureMockMvc,以及Mockito的@MockBean来模拟依赖。此外,测试方法的命名和结构应遵循最佳实践,如使用Given-When-Then模式。 另外,要考虑到用户可能需要处理不同的HTTP方法(GET、POST等),以及如何传递参数和处理响应数据。例如,POST请求可能需要使用MockMvcRequestBuilders.post,并设置contentType和content。这部分也需要在示例中展示,以覆盖更多场景。 最后,应该生成相关问题,帮助用户深入理解单元测试的其他方面,比如如何测试Service层、使用Mockito框架,或者处理数据库交互的测试。这些问题需要与用户的问题相关,并引导他们进一步学习。 在检查过程中,要确保所有技术细节正确无误,比如MockMvc的使用方法、断言的正确语法,以及依赖注入的方式。同时,引用相关的引用资料来支持建议,比如引用[3]中提到的测试覆盖特定分支的例子,可以在异常处理的测试部分提到。 总结一下,回答需要包括以下部分: 1. 测试环境搭建(使用Spring Boot Test和MockMvc) 2. 基本GET请求测试示例 3. POST请求测试示例 4. 模拟依赖(如Service层) 5. 异常和分支覆盖测试 6. 相关问题引导 每个部分都需要代码示例和对应的解释,同时引用提供的资料来增强可信度。确保代码格式正确,使用正确的注解和方法,并且测试案例能够实际运行。</think>### 如何为Controller编写单元测试(Spring Boot示例) #### 1. 测试环境搭建 使用`@SpringBootTest`和`@AutoConfigureMockMvc`注解初始化测试环境: ```java @SpringBootTest @AutoConfigureMockMvc public class MyControllerTest { @Autowired private MockMvc mockMvc; @MockBean private MyService myService; // 模拟依赖的Service } ``` #### 2. 基础GET请求测试 验证响应状态码和内容: ```java @Test public void testHelloEndpoint() throws Exception { mockMvc.perform(MockMvcRequestBuilders.get("/api/hello")) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.content().string("Hello World")); } ``` *该测试覆盖了Controller的基本响应逻辑,类似引用[2]中的测试结构* #### 3. POST请求参数验证 测试包含请求体的接口: ```java @Test public void testCreateUser() throws Exception { String userJson = "{\"name\":\"Alice\",\"age\":25}"; mockMvc.perform(MockMvcRequestBuilders.post("/api/users") .contentType(MediaType.APPLICATION_JSON) .content(userJson)) .andExpect(MockMvcResultMatchers.status().isCreated()) .andExpect(jsonPath("$.id").exists()); } ``` #### 4. 模拟依赖测试 当Controller依赖Service层时: ```java @Test public void testGetUserById() throws Exception { // 模拟Service返回 when(myService.getUser(1L)).thenReturn(new User(1L, "Bob")); mockMvc.perform(MockMvcRequestBuilders.get("/api/users/1")) .andExpect(status().isOk()) .andExpect(jsonPath("$.name").value("Bob")); } ``` *通过@MockBean隔离依赖,类似引用[3]中模拟tokenHelper的做法* #### 5. 异常场景测试 验证异常处理逻辑: ```java @Test public void testInvalidRequest() throws Exception { // 模拟Service抛出异常 when(myService.processRequest(any())).thenThrow(new IllegalArgumentException()); mockMvc.perform(MockMvcRequestBuilders.post("/api/process") .content("{}")) .andExpect(status().isBadRequest()) .andExpect(jsonPath("$.success").value(false)); } ``` *这种测试覆盖了Controller的异常处理分支,如引用[3]中测试null返回值的情况* #### 6. 验证请求参数 测试参数校验逻辑: ```java @Test public void testValidation() throws Exception { mockMvc.perform(MockMvcRequestBuilders.get("/api/search?page=0")) .andExpect(status().isBadRequest()); } ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值