Spring MockMvc

  • Post category:Java

以下是关于Spring MockMvc的完整攻略。

Spring MockMvc基本原理

Spring MockMvc是Spring MVC中的一个测试框架,用于模拟HTTP请求和响应。它允许我们不启动服务器的情况下测试控制器的行为。Spring MockMvc的步如下:

  1. 创建MockMvc对象
  2. 发送HTTP
  3. 验证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 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是一个非常有用的测试框架,可以帮助我们测试控制器的行为和表单提交。