以下是关于Spring MockMvc的完整攻略。
Spring MockMvc基本原理
Spring MockMvc是Spring MVC中的一个测试框架,用于模拟HTTP请求和响应。它允许我们不启动服务器的情况下测试控制器的行为。Spring MockMvc的步如下:
- 创建MockMvc对象
- 发送HTTP
- 验证HTTP响应
下面将详细说明每步。
步骤1:创建MockMvc对象
在使用Spring MockMvc之前,需要先创建MockMvc对象。可以使用以下示例:
@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
public class HelloControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testHello() throws Exception {
mockMvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string("Hello, World!"));
}
}
在上面的示例中,我们创建了一个HelloControllerTest类,并使用@RunWith和@WebMvcTest注解将其标记为测试类。在类中,我们使用@Autowired注解注入了一个MockMvc对象。
步骤2:发送HTTP请求
在创建MockMvc对象之,就可以发送HTTP请求了。可以使用以下示例:
@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
public class HelloControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testHello() throws Exception {
mockMvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string("Hello, World!"));
}
}
在上面的示例中,我们使用perform()方法发送了一个GET请求,并将其映射到/hello路径。
步骤3:验证响应
在发送HTTP请求之后,就需要验证HTTP响应了。可以使用以下示例:
@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
public class HelloControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testHello() throws Exception {
mockMvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string("Hello, World!"));
}
}
在上面的示例中,我们使用andExpect()方法验证HTTP响应。在示例中,验证HTTP响应的状态码为200,并且响应内容为”Hello, World!”。
示例
下面是两个使用Spring MockMvc的示例:
示例1:使用Spring MockMvc测试控制器
在这个示例中,我们将使用Spring MockMvc测试控制器。
HelloController.java
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
在上面的示例中,我们创建了一个HelloController类,并使用@RestController注解将其标记为控制器。在类中,我们创建了一个hello()方法,并使用@GetMapping注解将其映射到/hello路径。
HelloControllerTest.java“`java
@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
public class HelloControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testHello() throws Exception {
mockMvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string("Hello, World!"));
}
}
在上面的示例中,我们创建了一个HelloControllerTest类,并使用@RunWith和@WebMvcTest注解将其标记为测试类。在类中,我们@Autowired注解注入了一个MockMvc对象,并编写了一个testHello()方法。在方法中,我们使用perform()方法发送了一个GET请求,并将其映射到/hello路径。我们还使用andExpect()方法验证HTTP响应。
### 示例2:使用Spring MockMvc测试表单
在这个示例中,我们将使用 MockMvc测试表单。
#### UserController.java
```java
@Controller
public class UserController {
@GetMapping("/user")
public String userForm(Model model) {
model.addAttribute("user", new User());
return "user";
}
@PostMapping("/user")
public String userSubmit(@ModelAttribute User user) {
return "result";
}
}
在上面的示例中,我们创建了一个UserController类,并使用@Controller注解将其标记为控制器。在类中,我们创建了一个userForm(),并使用@GetMapping注解将其映射到/user路径。在方法中,我们将一个空的User对象添加到模型中,并返回user视图。我们还创建了一个userSubmit()方法,并使用@PostMapping注解将其映射到/user路径。在方法中,我们接收User对象,并返回result视图。
User.java
public class User {
private String name;
private String email;
// getters and setters
}
在上面的示例中,我们创建了一个User类,并添加了name和email属性以及相应的getter和setter方法。
user.html“`html
User Form
在上的示例中,我们创建了一个user.html文件,并添加了一个表单。在表单中,我们使用POST方法将数据提交到/user路径。
#### UserControllerTest.java
```java
@RunWith(SpringRunner)
@WebMvcTest(UserController.class)
public class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testUserForm() throws Exception {
mockMvc.perform(get("/user"))
.andExpect(status().isOk())
.andExpect(view().name("user"))
.andExpect(model().attributeExists("user"));
}
@Test
public void testUserSubmit() throws Exception {
mockMvc.perform(post("/user")
.param("name", "John")
.param("email", "john@example.com"))
.andExpect(status().isOk())
.andExpect(view().name("result"));
}
}
在上面的示例中,我们创建了一个UserControllerTest类,并使用@RunWith和@WebMvcTest注解将其标记为测试类。在类中,我们使用@Autowired注解注入了一个Mock对象,并编写了两个测试方法。在testUserForm()方法中,我们使用perform()方法发送了一个GET请求,并将其映射到/user路径。我们还使用andExpect()方法验证HTTP响应。在testUserSubmit()方法中,我们使用perform()方法发送了一个POST,并将数据提交到/user路径。我们还使用andExpect()方法验证HTTP响应。
总结
就关于Spring MockMvc的整攻略。Spring MockMvc是一个非常有用的测试框架,可以帮助我们测试控制器的行为和表单提交。