zoukankan      html  css  js  c++  java
  • 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. }




  • 相关阅读:
    【模板】2-SAT 问题
    HDU5875 Function
    Codeforces Round #380 (Div. 2)/729B Spotlights 水题
    Codeforces Round #380 (Div. 2)/729E Subordinates 贪心
    Codeforces Round #380 (Div. 2)/729D Sea Battle 思维题
    HDU 5869 Different GCD Subarray Query 树状数组+离线
    HDU 5696 区间的价值 暴力DFS
    HDU 5876 Sparse Graph BFS+set删点
    HDU 5868 Different Circle Permutation Burnside引理+矩阵快速幂+逆元
    HDU 5800 To My Girlfriend DP
  • 原文地址:https://www.cnblogs.com/Frank-Hao/p/5427571.html
Copyright © 2011-2022 走看看