Mock单元测试

导入需要的包
在pom.xml中添加

  1. <dependency>
  2. <groupId>junit</groupId>
  3. <artifactId>junit</artifactId>
  4. <version>${junit.version}</version>
  5. <scope>test</scope>
  6. <exclusions>
  7. <exclusion>
  8. <artifactId>hamcrest-core</artifactId>
  9. <groupId>org.hamcrest</groupId>
  10. </exclusion>
  11. </exclusions>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.hamcrest</groupId>
  15. <artifactId>hamcrest-all</artifactId>
  16. <version>${hamcrest.version}</version>
  17. <scope>test</scope>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.mockito</groupId>
  21. <artifactId>mockito-core</artifactId>
  22. <version>${mockito.core.version}</version>
  23. <scope>test</scope>
  24. <exclusions>
  25. <exclusion>
  26. <artifactId>hamcrest-core</artifactId>
  27. <groupId>org.hamcrest</groupId>
  28. </exclusion>
  29. </exclusions>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.springframework</groupId>
  33. <artifactId>spring-test</artifactId>
  34. <version>${spring.version}</version>
  35. <scope>test</scope>
  36. </dependency>
  37. <!-包版本参数-!>
  38. <properties>
  39. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  40. <spring.version>4.0.0.RELEASE</spring.version>
  41. <junit.version>4.11</junit.version>
  42. <hamcrest.version>1.3</hamcrest.version>
  43. <mockito.core.version>1.9.5</mockito.core.version>
  44. </properties>

对于JSON请求和响应验证需要安装jackson Json和JsonPath依赖:

  1. <dependency>
  2. <groupId>com.fasterxml.jackson.core</groupId>
  3. <artifactId>jackson-databind</artifactId>
  4. <version>${jackson2.version}</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.jayway.jsonpath</groupId>
  8. <artifactId>json-path</artifactId>
  9. <version>${jsonpath.version}</version>
  10. <scope>test</scope>
  11. </dependency>
  12. <properties>
  13. <jsonpath.version>0.9.0</jsonpath.version>
  14. <jackson2.version>2.2.3</jackson2.version>
  15. </properties>

Spring mvc测试框架提供了测试MVC需要的API,主要包括有Servlet/JSP Mock,MockMvcBuilder,MockMvcRequestBuilder,ResultMatcher,ResultHandler,MvcResult。
可以静态导入方便测试:

  1. import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;
  2. import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
  3. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
  4. import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;

测试步骤如下:

  1. 准备测试环境
  2. 通过MockMvc执行请求
  3. 验证步骤
    3.1. 添加验证断言
    3.2. 添加结果处理器
    3.3. 得到MvcResult进行自定义断言/进行下一步的异步请求
  4. 卸载测试环境
    以下是一个测试的完整步骤。
  1. //只显示了静态导入的部分
  2. import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;
  3. import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
  4. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
  5. import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;
  6. //配置环境
  7. @RunWith(SpringJUnit4ClassRunner.class)
  8. @WebAppConfiguration(value = "spring-mvc-test/src/main/webapp")
  9. @ContextHierarchy({
  10. @ContextConfiguration(locations = "classpath:spring-config.xml"),
  11. @ContextConfiguration(locations = "classpath:spring-mvc.xml")
  12. })
  13. public class ServerControllerTest {
  14. @Autowired
  15. private WebApplicationContext wac;
  16. @Mock
  17. private MockMvc mockMvc;
  18. @Before
  19. public void setUp() {
  20. //设置mock对象
  21. mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
  22. }
  23. @Test
  24. public void test1() throws Exception {
  25. //测试普通控制器
  26. mockMvc.perform(get("/user/{id}", 1)) //执行请求
  27. .andExpect(model().attributeExists("user")) //验证存储模型数据
  28. .andExpect(model().attribute("user", hasProperty("name", equalTo("zhang")))) //验证存储模型数据
  29. .andExpect(view().name("user/view")) //验证viewName
  30. .andExpect(forwardedUrl("/WEB-INF/jsp/user/view.jsp"))//验证视图渲染时forward到的jsp
  31. .andExpect(status().isOk())//验证状态码
  32. .andDo(print()); //输出MvcResult到控制台
  33. }
  34. }

1.构建MockMvc对象

MockMvc对象由MockMvcBuilder来构造,有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder。
我们可以通过静态工厂MockMvcBuilders来创建。

对于传入了webApplicationContext的DefaultMockMvcBuilder提供了以下的API:

standaloneSetup(Object…)返回的StandaloneMockMvcBuilder由于不涉及到webApplicationContext,只是对Controller类的测试,所以还可以对其添加拦截器,映射器,验证器等。

2.执行请求

获得MockMvc对象后,通过mockMvc.perform方法来执行请求。
请求有以下几类,都是MockMvcRequestBuilders中的静态方法:

常用的有get,post,fileUpload。
返回的是MockMvcRequestBuilder对象,有设置param,cookie,header,accept等的方法

perform方法返回ResultActions对象

3.进行验证

mockMvc.perform返回的是 org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder对象,可以链式调用:
andExpect:添加ResultMatcher验证规则
andDo:添加ResultHandler结果处理器
andReturn:返回org.springframework.test.web.servlet.MvcResult对象,可以对其进行进一步的测试。
MvcResult有以下方法:

在andExpect中,需要传入ResultMatcher,通常由MockResultMatchers类来调用静态方法获取不同的测试分类静态工厂类。

比如执行.view()后返回ViewResultsMatchers静态工厂类,这个类主要有两个方法,

,然后由静态工厂类来生成ResultMatcher对象。
ResultMatcher只有一个接口,类似于函数接口。

  1. public ResultMatcher name(final Matcher<? super String> matcher) {
  2. return new ResultMatcher() {
  3. @Override
  4. public void match(MvcResult result) throws Exception {
  5. ModelAndView mav = result.getModelAndView();
  6. assertTrue("No ModelAndView found", mav != null);
  7. assertThat("View name", mav.getViewName(), matcher);
  8. }
  9. };
  10. }




原文地址:https://www.cnblogs.com/Frank-Hao/p/5427571.html