如何在springMVC 中对REST服务使用mockmvc 做测试

时间:2023-02-11 00:01:26
spring 集成测试中对mock 的集成实在是太棒了!但是使用请注意一下3个条件。
 
  • junit 必须使用4.9以上
  • 同时您的框架必须是用spring mvc
  • spring 3.2以上才完美支持
 
目前使用spring MVC 取代struts2 的很多,spring MVC 的各种灵活让人无比销魂!所以使用spring MVC吧!
以前在对接口(主要是java服务端提供的接口(一般是:webService,restful))进行测试的中一般用以下俩种方法。测试流程如图:

如何在springMVC 中对REST服务使用mockmvc 做测试
 
1 直接使用httpClient 
    这方法各种麻烦
 
2 使用Spring 提供的RestTemplate
    错误不好跟踪,必须开着服务器
 
3 使用mockMVC都不是问题了看使用实例:
 
使用事例如下:父类
 
  1. import  org.junit.runner.RunWith;
  2. import  org.springframework.beans.factory.annotation.Autowired;
  3. import  org.springframework.test.context.ContextConfiguration;
  4. import  org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  5. import  org.springframework.test.context.web.WebAppConfiguration;
  6. import  org.springframework.web.context.WebApplicationContext;
  7. @WebAppConfiguration
  8. @ContextConfiguration (locations = {  "classpath:applicationContext.xml" ,
  9. "classpath:xxxx-servlet.xml"  })
  10. public class  AbstractContextControllerTests {
  11. @Autowired
  12. protected  WebApplicationContext wac;
  13. }
  14. 子类:
  15. import  org.junit.Before;
  16. import  org.junit.Test;
  17. import  org.junit.runner.RunWith;
  18. import  org.springframework.beans.factory.annotation.Autowired;
  19. import  org.springframework.http.MediaType;
  20. import  org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  21. import  org.springframework.test.web.servlet.MockMvc;
  22. import  org.springframework.test.web.servlet.setup.MockMvcBuilders;
  23. import  com.conlect.oatos.dto.status.RESTurl;
  24. import  com.qycloud.oatos.server.service.PersonalDiskService;
  25. //这个必须使用junit4.9以上才有。
  26. @RunWith (SpringJUnit4ClassRunner. class )
  27. public class  PersonalDiskMockTests  extends  AbstractContextControllerTests {
  28. private static  String URI = RESTurl.searchPersonalFile;
  29. private  MockMvc mockMvc;
  30. private  String json = "{\"entId\":1234,\"userId\":1235,\"key\":\"new\"}" ;
  31. @Autowired
  32. private  PersonalDiskService personalDiskService;
  33. @Before
  34. public void  setup() {
  35. //this.mockMvc = webAppContextSetup(this.wac).alwaysExpect(status().isOk()).build();
  36. this .mockMvc = MockMvcBuilders.standaloneSetup(personalDiskService).build();
  37. }
  38. @Test
  39. public void  readJson()  throws  Exception {
  40. this .mockMvc.perform(
  41. post(URI,  "json" ).characterEncoding( "UTF-8" )
  42. .contentType(MediaType.APPLICATION_JSON)
  43. .content(json.getBytes()))
  44. .andExpect(content().string( "Read from JSON: JavaBean {foo=[bar], fruit=[apple]}" )
  45. );
  46. }
上面是简单的例子,实际使用起来可以稍做修改。记得导入spring -test jar 包。无需额外配置(是不是很方便!)
当然和junit 的assert 一起用的话效果更好。下面贴点例子。copy就能跑。
  1. package  com.qycloud.oatos.server.test.mockmvcTest;
  2. import static  org.junit.Assert.fail;
  3. import static  org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
  4. import  java.io.UnsupportedEncodingException;
  5. import  java.lang.reflect.Field;
  6. import  org.springframework.http.MediaType;
  7. import  org.springframework.test.web.servlet.MockMvc;
  8. import  com.conlect.oatos.dto.status.CommConstants;
  9. import  com.conlect.oatos.dto.status.ErrorType;
  10. import  com.conlect.oatos.http.PojoMapper;
  11. public class  MockUtil {
  12. /**
  13. * mock
  14. *
  15. * @param uri
  16. * @param json
  17. * @return
  18. * @throws UnsupportedEncodingException
  19. * @throws Exception
  20. */
  21. public static  String mock(MockMvc mvc, String uri, String json)
  22. throws  UnsupportedEncodingException, Exception {
  23. return  mvc
  24. .perform(
  25. post(uri,  "json" ).characterEncoding( "UTF-8" )
  26. .contentType(MediaType.APPLICATION_JSON)
  27. .content(json.getBytes())).andReturn()
  28. .getResponse().getContentAsString();
  29. }
  30. /**
  31. *
  32. * @param re 返回值
  33. * @param object 要转换的对象
  34. * @param testName 当前测试的对象
  35. */
  36. public static  <T>  void  check(String re, Class<T> object,String testName) {
  37. System.out.println(re);
  38. if  (ErrorType.error500.toString().equals(re)) {
  39. System.out.println( "-----该接口测试失败:-----"
  40. + testName);
  41. fail(re);
  42. }  else if  (CommConstants.OK_MARK.toString().equals(re)) {
  43. System.out.println( "-----该接口测试成功:-----"
  44. + testName);
  45. } else {
  46. System.out.println( "-----re----- :" +re);
  47. }
  48. if  (object !=  null ) {
  49. if  (re.contains( ":" )) {
  50. try  {
  51. T t = PojoMapper.fromJsonAsObject(re, object);
  52. System.out.println( "-----该接口测试成功:-----"
  53. + testName);
  54. }  catch  (Exception e) {
  55. System.out.println( "-----该接口测试失败:-----"
  56. + testName);
  57. fail(e.getMessage());
  58. }
  59. }
  60. }
  61. }
  62. /**
  63. * 初始化版本信息。每次调用测试用力之前首先更新版本信息
  64. * @param mockMvc
  65. * @param url
  66. * @param fileId
  67. * @param class1
  68. * @return
  69. * @throws UnsupportedEncodingException
  70. * @throws Exception
  71. */
  72. public static  <T> Long updateVersion(MockMvc mockMvc, String url,
  73. Long fileId, Class<T> class1)  throws  UnsupportedEncodingException, Exception {
  74. String re = mock(mockMvc, url, fileId+ "" );
  75. T dto = PojoMapper.fromJsonAsObject(re, class1);
  76. Long version = Long.parseLong(dto.getClass().getMethod( "getVersion" ).invoke(dto).toString());
  77. System.out.println( "version = " +version);
  78. return  version;
  79. }
  80. }

使用如下:

  1. @RunWith (SpringJUnit4ClassRunner. class )
  2. public class  PersonalDiskMockTests  extends  AbstractContextControllerTests {
  3. private  MockMvc mockMvc;
  4. private static  Long entId = 1234L;
  5. private static  Long adminId = 1235L;
  6. @Autowired
  7. private  PersonalDiskService personalDiskService;
  8. @Before
  9. public void  setup() {
  10. this .mockMvc = MockMvcBuilders.standaloneSetup(personalDiskService)
  11. .build();
  12. }
  13. /***
  14. * pass
  15. * 全局搜索企业文件
  16. *
  17. * @throws Exception
  18. */
  19. @Test
  20. public void  searchPersonalFile()  throws  Exception {
  21. SearchFileParamDTO sf =  new  SearchFileParamDTO();
  22. sf.setEntId(entId);
  23. sf.setKey( "li" );
  24. sf.setUserId(adminId);
  25. String json = PojoMapper.toJson(sf);
  26. String re = MockUtil.mock( this .mockMvc, RESTurl.searchPersonalFile,
  27. json);
  28. MockUtil.check(re, SearchPersonalFilesDTO. class ,  "searchPersonalFile" );
  29. }

当然@setup里面是每个@test执行时都会执行一次的,所以有些需要每次都实例化的参数可以放进来

如下:
  1. @Autowired
  2. private  ShareDiskService shareDiskService;
  3. @Before
  4. public void  setup() {
  5. this .mockMvc = MockMvcBuilders.standaloneSetup(shareDiskService)
  6. .build();
  7. try  {
  8. initDatas();
  9. }  catch  (Exception e) {
  10. e.printStackTrace();
  11. }
  12. }
  13. private void  initDatas()  throws  UnsupportedEncodingException, Exception {
  14. FileIdVersion = MockUtil.updateVersion(mockMvc,RESTurl.getShareFileById,FileId,ShareFileDTO. class );
  15. File2IdVersion = MockUtil.updateVersion(mockMvc,RESTurl.getShareFileById,File2Id,ShareFileDTO. class );
  16. oldPicFolderVersion = MockUtil.updateVersion(mockMvc,RESTurl.getShareFolderById,oldPicFolderId,ShareFolderDTO. class );
  17. }
  18. 以上是我摘抄别人的,以下是我在公司用的写法
  19. 如何在springMVC 中对REST服务使用mockmvc 做测试

    测试类:

  20. package cn.com.mcd;

    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

    import org.codehaus.jackson.map.ObjectMapper;
    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.MediaType;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import org.springframework.test.web.servlet.MockMvc;
    import org.springframework.test.web.servlet.MvcResult;
    import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
    import org.springframework.test.web.servlet.setup.MockMvcBuilders;

    import cn.com.mcd.common.ResultModel;
    import cn.com.mcd.controller.StoreLocalPmController;
    import cn.com.mcd.model.StoreLocalPm;

    @RunWith(SpringJUnit4ClassRunner.class)
    public class TestStoreLocalPm extends BaseControllerTest{
    //@Resource
    //private StoreLocalPmService storeLocalPmService;
    @Autowired
    private StoreLocalPmController storeLocalPmController;
    private MockMvc mockMvc;
    @Before
    public void setup() {
    //this.mockMvc = webAppContextSetup(this.wac).alwaysExpect(status().isOk()).build();
    this.mockMvc = MockMvcBuilders.standaloneSetup(storeLocalPmController).build();
    }
    /**
    * 根据条件查询列表
    */
    //@Test
    public void selectStoreLocalPmList() {
    StoreLocalPm storeLocalPm=new StoreLocalPm();
    Long id=1L;
    storeLocalPm.setId(id);//餐厅编号
    storeLocalPm.setStoreName("");//餐厅名称
    storeLocalPm.setAuditStatus("");//审核状态
    ResultModel resultModel=storeLocalPmController.selectStoreLocalPmList(null,storeLocalPm);
    System.out.print("test.resultModel="+resultModel.getResultCode()+"\n"+resultModel.getResultMsg()+"\n"+resultModel.getResultData());
    }
    /**
    * 根据id查询详情
    * @throws Exception
    */
    @Test
    public void selectByPrimaryKey() throws Exception {
    String url = "/storeLocalPm/selectByPrimaryKey";
    StoreLocalPm storeLocalPm =new StoreLocalPm();
    storeLocalPm.setId(1L);

    ObjectMapper mapper = new ObjectMapper();

    String json = mapper.writeValueAsString(storeLocalPm);


    MvcResult result = (MvcResult) mockMvc.perform(post(url)
    .contentType(MediaType.APPLICATION_JSON)
    .content(json)
    .param("epsToken", "token")
    .accept(MediaType.APPLICATION_JSON))
    .andExpect(status().isOk())
    .andDo(MockMvcResultHandlers.print())
    .andReturn();
    System.out.println("----------"+result.getResponse().getStatus());
    System.out.println("----------"+result.getResponse().getContentAsString());
    //Assert.assertEquals(200, result.getResponse().getStatus());
    //Assert.assertNotNull(result.getResponse().getContentAsString());

    //Long id=1L;
    //ResultModel resultModel=storeLocalPmController.selectByPrimaryKey(id);
    //System.out.print("test.resultModel="+resultModel.getResultCode()+"\n"+
    //resultModel.getResultMsg()+"\n"+resultModel.getResultData());

    }
    }

    1. cotroller
    2. package cn.com.mcd.controller;

      import java.util.List;

      import javax.annotation.Resource;

      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.ModelAttribute;
      import org.springframework.web.bind.annotation.RequestBody;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RequestMethod;
      import org.springframework.web.bind.annotation.ResponseBody;

      import cn.com.mcd.common.ResultModel;
      import cn.com.mcd.model.KitchenEquipmentPrice;
      import cn.com.mcd.model.StoreLocalPm;
      import cn.com.mcd.service.StoreLocalPmService;
      import cn.com.mcd.util.Constants;
      import cn.com.mcd.util.PagesPojo;

      @Controller
      @RequestMapping("/storeLocalPm")
      public class StoreLocalPmController {
      private static final long serialVersionUID = 4515788554984036250L;
      private static final Logger log = LoggerFactory.getLogger(StoreLocalPmController.class);
      @Resource
      private StoreLocalPmService storeLocalPmService;
      /**
      * query detail by id
      * @param id
      * @return
      */
      @RequestMapping(value = "/selectByPrimaryKey", method = RequestMethod.POST)
      @ResponseBody
      public ResultModel selectByPrimaryKey(@RequestBody StoreLocalPm storeLocalPm) {
      log.info(this.getClass().getName()+".selectByPrimaryKey.start.storeLocalPm="+storeLocalPm);
      ResultModel resultModel = new ResultModel();
      try{
      storeLocalPm=storeLocalPmService.selectByPrimaryKey(storeLocalPm.getId());
      log.info(this.getClass().getName()+".selectByPrimaryKey.success.storeLocalPm="+storeLocalPm);
      resultModel.setResultCode(Constants.SERVICE_SUCCESS_CODE);
      resultModel.setResultMsg(Constants.DATA_BASE_SEARCH_SUCCESS_MSG);
      resultModel.setResultData(storeLocalPm);
      }catch(Exception e){
      resultModel.setResultCode(Constants.SERVICE_ERROR_CODE);
      resultModel.setResultMsg(Constants.DATA_BASE_SEARCH_ERROR_MSG);
      }
      log.info(this.getClass().getName()+".selectByPrimaryKey.end.resultModel="+resultModel);
      return resultModel;
      }

      /**
      * query list by param
      * @param id
      * @return
      */
      @RequestMapping(value = "/selectStoreLocalPmList", method = RequestMethod.GET)
      @ResponseBody
      public ResultModel selectStoreLocalPmList(@ModelAttribute PagesPojo<StoreLocalPm> page,StoreLocalPm storeLocalPm) {
      log.info(this.getClass().getName()+".selectStoreLocalPmList.start.page="+page);
      ResultModel result = new ResultModel();
      try{
      int count = storeLocalPmService.countAll(storeLocalPm);
      page.setTotalRow(count);
      List<StoreLocalPm> list = storeLocalPmService.selectStoreLocalPmList(page);
      page.setPages(list);
      result.setResultCode(Constants.SERVICE_SUCCESS_CODE);
      result.setResultMsg(Constants.DATA_BASE_SEARCH_SUCCESS_MSG);
      result.setResultData(page);
      }catch(Exception e){
      result.setResultCode(Constants.SERVICE_ERROR_CODE);
      result.setResultMsg(Constants.DATA_BASE_SEARCH_ERROR_MSG);
      }
      log.info(this.getClass().getName()+".selectStoreLocalPmList.end.result="+result);
      return result;
      }
      int deleteByPrimaryKey(Long id){
      return 0;

      }

      int insert(StoreLocalPm record) {
      return 0;
      }

      int insertSelective(StoreLocalPm record){
      return 0;

      }

      int updateByPrimaryKeySelective(StoreLocalPm record) {
      return 0;
      }

      int updateByPrimaryKey(StoreLocalPm record) {
      return 0;
      }
      }

如何在springMVC 中对REST服务使用mockmvc 做测试的更多相关文章

  1. 如何在SpringMVC中使用REST风格的url

    如何在SpringMVC中使用REST风格的url 1.url写法: get:/restUrl/{id} post:/restUrl delete:/restUrl/{id} put:/restUrl ...

  2. 如何在ubuntu中启用SSH服务

    如何在ubuntu14.04 中启用SSH服务 开篇科普:  SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为 ...

  3. 如何在Ruby中编写微服务?

    [编者按]本文作者为 Pierpaolo Frasa,文章通过详细的案例,介绍了在Ruby中编写微服务时所需注意的方方面面.系国内 ITOM 管理平台 OneAPM 编译呈现. 最近,大家都认为应当采 ...

  4. 如何在IIS中设置HTTPS服务

    文章:https://support.microsoft.com/en-us/help/324069/how-to-set-up-an-https-service-in-iis 在这个任务中 摘要 为 ...

  5. 如何在SpringMVC中获取request对象

    1.注解法 @Autowired private HttpServletRequest request; <listener> <listener-class> org.spr ...

  6. 如何在BPM中使用REST服务(1):通过程序访问网页内容

    这篇文章主要描述如何通过程序来访问网页内容,这是访问REST服务的基础. 在Java中,我们可以使用HttpUrlConnection类来实现,代码如下. package http.base; imp ...

  7. 如何在 IIS 中设置 HTTPS 服务

    Windows Server2008.IIS7启用CA认证及证书制作完整过程 这篇文章介绍了如何安装证书申请工具: 如何在iis创建证书申请: 如何使用iis申请证书生成的txt文件,在工具中开始申请 ...

  8. 技术干货丨如何在VIPKID中构建MQ服务

    小结: 1. https://mp.weixin.qq.com/s/FQ-DKvQZSP061kqG_qeRjA 文 |李伟 VIPKID数据中间件架构师 交流微信 | datapipeline201 ...

  9. 如何在Linux中关闭apache服务&lpar;转&rpar;

    ??? 最近在写一个简单的http服务器,调试的时候发现apache服务器也在机器上跑着,所以得先把apache关掉.当时装apache的时候就是用了普通的sudo get,也不知道装到哪儿了.到网上 ...

随机推荐

  1. mysql安装方法

    Window版本 1.下载 MySQL Community Server 5.7.16 http://dev.mysql.com/downloads/mysql/ 2.解压 如果想要让MySQL安装在 ...

  2. 夺命雷公狗—angularjs—9—ng-class的自定义函数的用法

    angularjs里面其实给我们留下了一个很不错的地方,他就是可以直接调用函数从而对该位置进行处理, 被点击后展示效果如下所示: 开始走代码吧.... <!doctype html> &l ...

  3. Codeforces 279 B Books

    题意:给出n本书,总的时间t,每本书的阅读时间a[i],必须按照顺序来阅读,问最多能够阅读多少本书 有点像紫书的第七章讲的那个滑动区间貌似 维护一个区间的消耗的时间小于等于t,然后维护一个区间的最大值 ...

  4. GridView使用CommandField删除列实现删除时提示确认框

    在.net2005提供的GridView中我们可以直接添加一个CommandField删除列完后在它的RowDeleting事件中完成删除 GridView在使用CommandField删除时弹出提示 ...

  5. centos&plus;nginx&plus;uwsgi&plus;virtualenv&plus;flask 多站点环境搭建

    环境: centos x64 6.6 nginx 1.6.2 python 2.7.9 uwsgi 2.0.9 virtualenv 12.0.5 flask 0.10.1 正文: 1.安装nginx ...

  6. cf B&period; Inna and Nine

    http://codeforces.com/contest/374/problem/B #include <cstdio> #include <cstring> #includ ...

  7. No curses&sol;termcap library found

    CentOS6.5中编译Mysql时遇见如下错误 error: No curses/termcap library found checking for tgetent in -lncurses... ...

  8. windows10不能修改hosts解决方案(亲测)

    hosts文本解释: 有时候我们要破解一些软件与服务器通讯,所以通常都需要更改Hosts文件来达到目的,XP系统可以直接修改保存,但是Win10系统却提示没有权限去修改,那么我们要怎样办呢,我们修改的 ...

  9. i春秋——Misc之百度杯

    今天心里很是不开森,想想往日何必那么努力呢?不如你的比比皆是,可是人家就是因为有关系,你又能怎样呢? 你所有应该有的都被打翻了,别灰心,至少你曾经努力过! 愿我未来的学弟学妹们都能一直开开心心的过好每 ...

  10. &lbrack;CQOI2014&rsqb;危桥

    题目描述 Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双 向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多只能通行两次. ...