Spring Boot是一个非常流行的web框架,在web应用程序的构建和单元测试中,我们需要模拟http请求和响应来进行测试,MockMvc框架就是为此而设计的。MockMvc框架可以模拟完整的http请求和响应,测试web应用程序的控制器和服务层。
一、MockMvc框架基础
MockMvc框架包括MockMvcBuilders,它可以用于创建MockMvc类的对象。MockMvcBuilder定义了完整的Spring MVC环境,它可以自定义SpringMvc应用程序的配置。
以下是使用Spring Boot和MockMvc的基本测试代码:
@RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc public class MyControllerTests { @Autowired private MockMvc mockMvc; @Test public void test() throws Exception { mockMvc.perform(get("/myController/test")) .andExpect(status().isOk()) .andExpect(content().string("Hello World!")); } }
在这个测试代码中,我们使用了@SpringBootTest注释来启用Spring Boot测试的自动配置,使得我们可以使用Spring Boot的自动配置来加载Spring应用程序上下文。
使用@AutoConfigureMockMvc注释,我们可以自动配置MockMvc。在此处,我们注入MockMvc对象,并使用perform()方法执行http GET请求。使用andExpect()方法检查响应状态码和响应体内容。
二、使用MockMvc框架测试控制器层
MockMvc框架可以很好的测试控制器层,我们可以使用模拟请求来测试控制器的各种HTTP方法。MockMvc还提供了一些有用的方法来模拟请求参数、头、cookie和会话等内容。以下是一个示例:
@RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc public class MyControllerTests { @Autowired private MockMvc mockMvc; @Test public void test() throws Exception { mockMvc.perform(get("/myController/test")) .andExpect(status().isOk()) .andExpect(content().string("Hello World!")); } @Test public void paramTest() throws Exception { mockMvc.perform(get("/myController/testParam") .param("name", "Tom")) .andExpect(status().isOk()) .andExpect(content().string("Hello Tom")); } @Test public void postTest() throws Exception { mockMvc.perform(post("/myController/testPost") .contentType(MediaType.APPLICATION_JSON) .content("{\"name\":\"Tom\"}")) .andExpect(status().isOk()) .andExpect(jsonPath("$.name").value("Tom")); } }
在这个测试代码中,我们演示了如何测试GET, POST方法和带参数的请求。在第二个测试中,我们使用param()方法设置请求参数,然后检查响应内容。在第三个测试中,我们使用了post()方法来模拟POST请求,然后检查响应的JSON内容。
三、使用MockMvc框架测试服务层
MockMvc框架可以使用Mockito、JUnit和Hamcrest等框架,测试服务层Spring Bean。在服务层的测试中,我们通常使用Mockito来模拟依赖的服务。以下是一个示例:
@RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc public class MyServiceTests { @MockBean private MyDAO myDAO; @Autowired private MyService myService; @Test public void test() throws Exception { when(myDAO.findByName("Tom")).thenReturn(new MyEntity("Tom")); String result = myService.getName("Tom"); assertEquals(result, "Tom"); } }
在这个测试代码中,我们使用@MockBean来注入一个模拟的MyDAO对象到Spring上下文中。在测试中,我们对myDAO进行了模拟,并使用when()方法定义方法参数和返回值。然后,我们调用myService.getName()方法来测试服务层的功能。
四、使用MockMvc框架测试异常
MockMvc框架也可以很好的测试异常的场景。以下是一个示例:
@RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc public class MyControllerTests { @Autowired private MockMvc mockMvc; @Test public void testException() throws Exception { mockMvc.perform(get("/myController/error")) .andExpect(status().isBadRequest()) .andExpect(jsonPath("$.message").value("Bad Request")); } }
在这个测试代码中,我们使用perform()方法来执行一个GET请求,其中我们调用了/myController/error接口,该接口会给出一个BadRequest响应。在测试中,我们使用andExpect()方法检查响应状态码和响应体内容。如果响应类型不是BadRequest,测试会失败。
五、结论
在Spring Boot应用程序中,MockMvc框架是一种非常方便实用的测试框架,它可以很好地测试web应用程序的控制器和服务层。在我们的测试中,我们可以使用Mockito模拟依赖的服务,在测试环境中模拟请求和响应。MockMvc还提供了很多有用的方法,如模拟请求参数、请求头、cookie和会话等。MockMvc框架还可以很好的测试异常场景。总之,MockMvc框架提供了一种非常简单、灵活的方式来测试Spring Boot应用程序,可以帮助我们更快地开发高质量的web应用程序。