Java Mock模拟接口请求

  • Post author:
  • Post category:java





1、Mock可以做什么

Mock可以模拟一个http接口的后台响应,就这么简单,可以模拟request、response




2、mock 数据的好处


(1)团队可以并行工作


有了Mock,前后端人员只需要定义好接口文档就可以开始并行工作,互不影响,只在最后的联调阶段往来密切;后端与后端之间如果有接口耦合,也同样能被Mock解决;测试过程中如果遇到依赖接口没有准备好,同样可以借助Mock;不会出现一个团队等待另一个团队的情况。这样的话,开发自测阶段就可以及早开展,从而发现缺陷的时机也提前了,有利于整个产品质量以及进度的保证。


(2)开启TDD模式,即测试驱动开发


单元测试是TDD实现的基石,而TDD经常会碰到协同模块尚未开发完成的情况,但是有了mock,这些一切都不是问题。当接口定义好后,测试人员就可以创建一个Mock,把接口添加到自动化测试环境,提前创建测试。


(3)可以模拟那些无法访问的资源


比如说,你需要调用一个“墙”外的资源来方便自己调试,就可以自己Mock一个。


(4)隔离系统


假如我们需要调用一个post请求,为了获得某个响应,来看当前系统是否能正确处理返回的“响应”,但是这个post请求会造成数据库中数据的污染,那么就可以充分利用Mock,构造一个虚拟的post请求,我们给他指定返回就好了


(5)可以用来演示


假如我们需要创建一个演示程序,并且做了简单的UI,那么在完全没有开发后端服务的情况下,也可以进行演示。说到演示了,假如你已经做好了一个系统,并且需要给客户进行演示,但是里面有些真实数据并不想让用户看到,那么同样,你可以用Mock接口把这些敏感信息接口全部替换。


(6)测试覆盖度


假如有一个接口,有100个不同类型的返回,我们需要测试它在不同返回下,系统是否能够正常响应,但是有些返回在正常情况下基本不会发生,难道你要千方百计地给系统做各种手脚让他返回以便测试吗?比如,我们需要测试在当接口发生500错误的时候,app是否崩溃,别告诉我你一定要给服务端代码做些手脚让他返回500 。。。而使用mock,这一切就都好办了,想要什么返回就模拟什么返回,妈妈再也不用担心我的测试覆盖度了



3、如何在java环境写mock接口


(1)先下载mock的jar包:

链接:

https://pan.baidu.com/s/1bFEjPOz8oh_i7oS4l-9RUQ


提取码: wwwr


(2)下载后,把jar包放到项目文件下面


在这里插入图片描述


(3)编写json脚本,这个脚本是用来模拟接口,以json格式保存

[
  {
    "description":"获取用户信息",
    "request":{
      "uri":"/getUser",
      "method":"get",
      "queries": {
        "id": "1"
      }
    },
    "response":{
      "status": 200,
      "json":{
        "name": "test",
        "is": "1",
        "age": 18,
        "sex": "woman"
      }
    }
  }
]


(4) 在console中,运行脚本,命令如下:

java -jar ./moco-runner-0.11.0-standalone.jar http -p 8889 -c startup1.json

在这里插入图片描述


(5)访问对应的接口,如下


在这里插入图片描述



下面是简单的几个案例


get请求:

[
  {
    "description":"获取用户信息",
    "request":{
      "uri":"/getUser",
      "method":"get",
      "queries": {
        "id": "1"
      }
    },
    "response":{
      "status": 200,
      "json":{
        "name": "test1",
        "is": "1",
        "age": 18,
        "sex": "woman"
      }
    }
  },
]


post请求:

[
 {
    "description":"新增用户",
    "request":{
      "uri":"/addUser",
      "method":"post",
      "json": {
        "name": "nyy",
        "age": "12",
        "sex": "man"
      }
    },
    "response":{
      "status": 200,
      "json":{
        "userId": 12
      }
    }
  }
]


带cookie的:

[
  {
    "description":"这是一个会返回cookies信息的get请求",
    "request":{
      "uri":"/getCookies",
      "method":"get"
    },
    "response":{
      "cookies":{
        "login":"true"
      },
      "text":"恭喜你获得cookies信息成功"
    }
  },
  {
    "description":"这是一个带cookies信息的get请求",
    "request":{
      "uri":"/get/with/cookies",
      "method":"get",
      "cookies":{
        "login":"true"
      }
    },
    "response":{
      "text":"这是一个需要携带cookies信息才能访问的get请求"
    }
  },
  {
    "description":"这是一个带cookies信息的post请求,json的数据写在body",
    "request":{
      "uri":"/post/with/cookies",
      "method":"post",
      "cookies":{
        "login":"true"
      },
      "json":{
        "name":"huhansan",
        "age":"18"
      }
    },
    "response":{
      "status":200,
      "json":{
        "huhansan":"success",
        "status":"1"
      }
    }
  }
]


带header的:

[
  {
    "description":"这是一个带header信息的post请求",
    "request":{
      "uri":"/post/with/headers",
      "method":"post",
      "headers":{
        "content-type":"application/json"
      },
      "json":{
        "name":"wanglaosi",
        "sex":"woman"
      }
    },
    "response":{
      "json":{
        "wanglaosi":"success",
        "status":"1"
      }
    }
  }
]


重定向:

[
  {
    "description":"重定向到百度",
    "request":{
      "uri":"/redirect"
    },
    "redirectTo":"http://www.baidu.com"
  },
  {
    "description":"重定向到一个自己的网页上",
    "request":{
      "uri":"/redirect/topath"
    },
    "redirectTo":"/redirect/new"
  },
  {
    "description":"这是被重定向到的请求",
    "request":{
      "uri":"/redirect/new"
    },
    "response":{
      "text":"重定向成功啦"
    }
  }
]



版权声明:本文为nieyayun2019原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。