Mock工具之Moco使用

news2024/11/16 1:33:45

一、什么是Mock

mock英文单词有愚弄、嘲笑、模拟的意思,这里主要是模拟的意思

二、什么是Moco

  • 开源的、基于java开发的一个mock框架
  • 支持http、https、socket等协议

三、Mock的特点

  • 只需要简单的配置request、response等即可满足要求

  • 支持在request 中设置headers、cookies等

  • 支持GET、POST、PUT、DELETE等请求方法

  • 无需环境配置,有Java环境即可

  • 修改配置文件后,立刻生效

  • 对可能用到的数据格式都支持,如json、text、xml、file等。

四、什么场景会用到

  • 模拟第三方接口的返回
  • 后端接口还没有开发完毕,前端想要进行联调
  • 接口测试过程中,可能某些接口依赖有问题,也可以使用mock

五、Moco的原理

  • 根据json配置文件,启动一个http的服务,监听指定的端口

六、环境准备

  • jdk1.8https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
  • mocohttps://repo1.maven.org/maven2/com/github/dreamhead/moco-runner/image

七、环境搭建

  • 安装jdk,配置环境变量
  • 把moco-runner-1.5.0-standalone.jar 和配置文件如moco.json放同一目录image

八、Moco配置文件

moco配置文件格式必须是json格式。配置文件是个数组,也就是说,可以在一个文件中配置多个接口的请求和响应

配置文件常用字段image

九、启动

# http 指定协议
# -p 指定端口
# -c 指定配置文件
java -jar moco-runner-1.5.0-standalone.jar http -p 8088 -c moco.json

十、示例

  • demo1
[
  {
    "description":"这是一个moco例子",
    "request":{
        "uri":"/demo"
    },
    "response":
    {
        "text":"Hello,Moco",
        "status": "200"
    }
  }
]
  • get请求,不带参数
[
    {
    "description":"这是一个get请求,不带参数",
    "request":{
        "uri":"/goods",
        "method": "get"
    },
    "response":
    {
        "headers": {
            "Content-Type": "text/plain; charset=GBK"
        },
        "text":"这是一个GET请求,不带参数",
        "status": "200"
    }
  }
]
  • get请求,带参数
[
  {
    "description": "这是一个get请求带参数",
    "request": {
      "uri": "/goods",
      "method": "get",
      "queries": {
        "id": "g01"
      }
    },
    "response":
    {
        "headers": {
            "Content-Type": "application/json;charset=utf-8"
        },
        "json":{"name": "百世可乐","price": 3},
        "status": "200"
    }

  }


]

image

  • post请求,带参数,带的是json参数
[
  {
    "description": "这是一个post请求带参数",
    "request": {
      "uri": "/goods",
      "method": "post",
      "json": {
        "id": "g01"
      }
    },
    "response":
    {
        "headers": {
            "Content-Type": "application/json;charset=utf-8"
        },
        "json":{"name": "百世可乐","price": 3},
        "status": "200"
    }

  }


]

image

  • post请求,带headers参数
[
  {
    "description": "post请求,带headers参数",
    "request": {
      "uri": "/goods",
      "method": "post",
	  "cookies":{"ssid":"666666"},
	  "headers":{"authorization": "bearer 123456"},
      "json": {
        "id": "g01"
      }
    },
    "response":
    {
        "headers": {
            "Content-Type": "application/json;charset=utf-8"
        },
        "json":{"name": "百世可乐","price": 3},
        "status": "200"
    }

  }


]

image

  • post请求,带forms参数
[
  {
    "description": "这是一个post请求,带forms参数",
    "request": {
      "uri": "/login",
      "method": "post",
      "forms": {
        "username": "admin",
		"password":"123456"
      }
    },
    "response":
    {
        "headers": {
            "Content-Type": "application/json;charset=utf-8"
        },
        "json":{"msg": "登录成功"},
        "status": "200"
    }

  }


]

image

  • 重定向
[
	{
        "description": "这是一个重定向",
        "request": {
            "uri": "/redirect",
            "method": "get"

        },
        "redirectTo": "http://www.baidu.com"

    }
]

十一、多配置文件模式

为了模拟多个接口,以及方便管理这些接口,moco-runner增加了配置模式,具体如下:

  • 首先,创建多个接口文件,比如:login.json,index.json
  • 然后,在当前文件夹下创建配置文件,config.json,用于管理接口文件login.json,index.json
  • 最后,用参数-g启动服务

接口文件moco.json

[
  {
    "description": "Moco Demo",
    "request": {
      "method": "get",
      "uri": "/demo"
    },
    "response": {
      "text": "Hello Moco"
    }
  },
  {
    "description": "users",
    "request": {
      "method": "get",
      "uri": "/users"
    },
    "response": {
      "headers": {
        "Content-Type": "application/json;charset=utf-8"
      },
      "json": {
        "code": 200,
        "msg": "success",
        "data": [
          {
            "id": 1,
            "username": "张三"
          },
          {
            "id": 2,
            "username": "李四"
          },
          {
            "id": 3,
            "username": "王五"
          }
        ]
      }
    }
  },
  {
    "description": "这是一个get请求,不带参数",
    "request": {
      "uri": "/goods",
      "method": "get"
    },
    "response": {
      "text": "这是一个GET请求,不带参数",
      "status": "200"
    }
  }
]

接口文件index.json

[
  {
    "description": "index",
    "request": {
      "method": "get",
      "uri": "/index"
    },
    "response": {
      "text": "Hello home"
    }
  }
]

配置文件config.json

[
	{"include":"index.json"},
	{"include":"moco.json"}

]

十二、中文乱码问题

加上参数 -Dfile.encoding=utf-8java -Dfile.encoding=utf-8 -jar moco-runner-1.5.0-standalone.jar http -p 8088 -c moco.json

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1078538.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Ceph Block Device】块设备挂载使用

文章目录 前言创建pool创建user创建image列出image检索image信息调整image大小增加image大小减少image大小 删除image从pool中删除image从pool中“延迟删除”image从pool中移除“延迟删除的image” 恢复image恢复指定pool中延迟删除的image恢复并重命名image 映射块设备格式化i…

Rockchip RK3399 - linux下抓取usb数据包

---------------------------------------------------------------------------------------------------------------------------- 开发板 :NanoPC-T4开发板eMMC :16GBLPDDR3 :4GB 显示屏 :15.6英寸HDMI接口显示屏u-boot &…

03黑马店评-添加商户缓存和商户类型的缓存到Redis

商户查询缓存 什么是缓存 实际开发过程中数据量可以达到几千万,缓存可以作为避震器防止过高的数据访问猛冲系统,避免系统内的操作线程无法及时处理信息而瘫痪 缓存(Cache)就是数据交换的缓冲区(储存临时数据的地方),我们俗称的"缓存"实际就是缓冲区内的数据(一般从…

L14D6内核模块编译方法

一、内核模块基础代码解析 一个内核模块代码错误仍然会导致的内核崩溃。 GPL协议:开源规定,使用内核一些函数需要 1、单内核的缺点 单内核扩展性差的缺点减小内核镜像文件体积,一定程度上节省内存资源提高开发效率不能彻底解决稳定性低的缺…

香港鼎鑫鸿鄴:紧跟国家新能源政策,制定合理发展规划

由于全球环境的变化以及环境的需要,世界上的许多资源企业正在努力研究和开发新的、更好的绿色产品和服务,并且取得了一系列的突破和成果——其中最为瞩目的是新能源领域的发展与革新。随着我国经济的快速发展,人民生活水平的不断提高,对清洁能源的需求日益增长,同时也带动了新能…

python 定时器

需求 我想在某一时刻完成某个任务,需要一个定时计划 调研了几种方式都不是很理想. 参考,python实现定时任务的8种方式详解 选择使用 apscheduler 库吧 APScheduler简介 APScheduler是Python的一个定时任务框架,用于执行周期或者定时任务,该框架不仅可以…

【数据结构】二叉树遍历的实现(超详细解析,小白必看系列)

目录 一、前言 🍎为何使用链式二叉树 🍐何为链式二叉树 🍉二叉树的构建 💦创建二叉链结构 💦手动构建一颗树 🍓二叉树的遍历 (重点) 💦前序遍历 💦中…

二维码智慧门牌管理系统:提升小区管理的智能化水平

文章目录 前言一、二维码智慧门牌管理系统简介二、精准的门牌定位三、门牌编号优化三、更多特点四、未来展望 前言 随着科技的不断发展,智能化管理已经深入到我们生活的方方面面,而小区作为我们居住的重要场所,智能化管理更是必不可少。为了…

警惕!外贸常见的一些骗局!

随着网络技术和国际支付的普及,外贸汇款骗局也是时常发生,本文将列举外贸汇款骗局的常见套路和风险提示,以帮助广大外贸人更好地护好自己的“钱袋子”。 常见套路 1.钓鱼 出口商与买家的订单已经谈妥,把收款信息通过邮件发给买家…

【重拾C语言】七、指针(二)指针与数组(用指针标识数组、多维数组与指针、数组指针与指针数组)

目录 前言 七、指针 7.1~3 指针与变量、指针操作、指向指针的指针 7.4 指针与数组 7.4.1 用指针标识数组 7.4.2 应注意的问题 a. 数组名是指针常量 b. 指针变量的当前值 c. 数组超界 7.4.3 多维数组与指针 7.4.4 指针数组 a. 指针数组 b. 数组指针 c. 对比总结 前…

bash上下键选择选项demo脚本

效果如下: 废话不多说,上代码: #!/bin/bashoptions("111" "222" "333" "444") # 选项列表 options_index0 # 默认选中第一个选项 options_len${#options[]}echo "请用上下方向键进行选择&am…

【多线程案例】Java实现简单定时器(Timer)

1.定时器(Timer) 1.什么是定时器? 在日常生活中,如果我们想要在 t 时间 后去做一件重要的事情,那么为了防止忘记,我们就可以使用闹钟的计时器功能,它会在 t 时间后执行任务(响铃)提醒我们去执行这件事情. — 这就是J…

【数据结构-队列 二】【单调队列】滑动窗口最大值

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【单调队列】,使用【队列】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…

Springboot整合Druid:数据库密码加密的实现

ps:Springboot项目,为了防止某些人反编译看到yml里面的数据库密码,对密码进行加密处理,隐藏公钥形式。(总有人想扒掉你的底裤看看你屁股长什么样) 1.引入依赖(以前有依赖就不用了) 2.找到Druid…

你想知道的测试自动化-概览篇

测试自动化概念整理 协议 JSON Wire Protocol Specification JSON Wire 协议 现已过时的开源协议的端点和有效负载,它是W3C webdriver的先驱。 devtool协议 Chrome DevTools 协议允许使用工具来检测、检查、调试和分析 Chromium、Chrome 和其他基于 Blink 的浏…

轻松驾驭Hive数仓,数据分析从未如此简单!

1 前言 先通过SparkSession read API从分布式文件系统创建DataFrame 然后,创建临时表并使用SQL或直接使用DataFrame API,进行数据转换、过滤、聚合等操作 最后,再用SparkSession的write API把计算结果写回分布式文件系统 直接与文件系统交…

MyLife - Docker安装Redis

Docker安装Redis 个人觉得像reids之类的基础设施在线上环境直接物理机安装使用可能会好些。但是在开发测试环境用docker容器还是比较方便的。这里学习下docker安装redis使用。 1. Redis 镜像库地址 Redis 镜像库地址:https://hub.docker.com/_/redis/tags 这里是官方…

四向穿梭车智能机器人|HEGERLS托盘式四向穿梭车系统的换轨技术和故障恢复功能

随着物流行业的迅猛发展,托盘四向穿梭式立体库因其在流通仓储体系中所具有的高效密集存储功能优势、运作成本优势与系统化智能化管理优势,已发展为仓储物流的主流形式之一。托盘四向穿梭车立体仓库有全自动和半自动两种工作模式,大大提高了货…

java基础 异常

异常概述: try{ } catch{ }: package daysreplace;import com.sun.jdi.IntegerValue;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.…

pymoo包NSGA2算法实现多目标遗传算法调参详细说明

pymoo包NSGA2算法实现多目标遗传算法调参详细说明 1.定义待求解问题1.0定义问题的参数说明1.0.0 求解问题必须设置在def _evaluate(self, x, out, *args, **kwargs)函数中1.0.1 问题必须用 out["F"] [f1, f2] 包裹起来1.0.2 约束条件也必须用 out["G"] […