当前位置: 首页 > news >正文

服务模拟-ServiceMock

在软件开发过程中,经常会有如下情况发生:

  1. 界面开发人员要开发界面,但是要使用的服务还没有开发好,这个时候,要么只能开发一半,要么就只能等服务开发好之后再继续进行开发,无论是哪一种情况,都会导致影响开发进度。
  2. 与第三方对接的时候,由于各种原因,无法在本地构建第三方测试环境,只能到客户现场进行开发和测试,这会导致出差成本增加,开发人员满意度下降等情况的发生。
  3. 做一个Demo系统,如果是全部做静态页面,与客户沟通讲解的时候,总是讲起来不够真实,如果全部采用真实实现,会导致Demo系统构建成本太高。

Tiny框架为了避免上述问题,增加了ServiceMock工程,顾名思义就是Mock一个服务,它的访问接口和真实的完全一致,但是内部的实现却是虚假的,这样就可以比较好的解决上面的问题:

  1. 对于并行开发来说,只要先花一点时间简单做个MockService,界面开发人员就可以完全按照真实的方式进行开发、测试了,绝大多数的情况都可以满足展现和控制层的开发要求。
  2. 对于与第三方对接的情况,只要先做好与对应的第三方所有接口的MockService,就可以完全在本地进行开发与测试,最后只要到现场做集成测试即可。
  3. 做出来的系统完全可以做得更真实,比如:做个HelloWorld服务,比如在输入框中输入的是”abc“,展现出的效果是”Hello,abc“的效果比”Hello,World“的效果好得多,同时又不用花太多的工作量。

下面就用一个具体的例子来进行说明:

编写下面的Xml文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
< mock-service >
    < mock-service-info service-id = "helloworld" >
       < parameters >
         < parameter name = "name" type = "java.lang.String" required = "true" is-array = "false" ></ parameter >
       </ parameters >
       < results >
          < parameter name = "result" required = "false" is-array = "false" type = "java.lang.String" ></ parameter >
       </ results >
    </ mock-service-info >
    < result-templates >
        < result-template result-key = "result" >
          < template > <![CDATA[
              <string>hello,${name}!<string>
          ]]> </ template >
        </ result-template >
    </ result-templates >
</ mock-service >

它的意思是:mock的ServiceId是helloworld

有一个入参,是字符类型,名字叫:name,有一个出参,也是字符类型,名字是result

在后面定义了出差是result的结果,它实际是一段模板,这段模板采用了TinyTemplate模板引擎来解释执行,上面的意思是用输入的参数name的值来替换${name}这个占位符,所以这个服务就可以直接执行,并且会根据输入name的值的不同,而返回对应的值,比如:参数name的值是abc,那么返回的值就是hello,abc!

实际上,它也可以做复杂一点的场景:


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
< mock-service >
    < mock-service-info service-id = "plus" >
       < parameters >
         < parameter name = "a" type = "java.lang.Integer" required = "true" is-array = "false" ></ parameter > < span ></ span > </ parameters >
        < parameter name = "b" type = "java.lang.Integer" required = "true" is-array = "false" ></ parameter >  </ parameters >
       < results >
        < parameter name = "result" type = "java.lang.Integer" required = "true" is-array = "false" ></ parameter >  </ parameters >
       </ results >
    </ mock-service-info >
    < result-templates >
        < result-template result-key = "result" >
          < template > <![CDATA[
              <integer>${a+b}<integer>
          ]]> </ template >
        </ result-template >
    </ result-templates >
</ mock-service >

上面的这个MockService实现是可以真正完成加法运算的服务。

实际上,我们Mock出来的Service是真正的Service,它可以通过Json,Xml,WebService,等各种方式进行访问,实际上,对于调用者来说,它就是真正的Service,之所以我们Mock出来的Service可以骗过所有的使用者,是因为我们做了一个专门的服务加载器,把所有的MockService相关的信息读出来,并在服务框架进行注册,真正调用的时候,用调用MockServiceManager来进行真正的执行,执行过程就是读取这段模板并执行出结果之后,把结果返回。

后续,我们做对应的工具来编写这个Xml,那样做起来就更方便了。



相关文章:

  • 超链接点击一次就失效不能再点击
  • #Java异常处理
  • 1.请求安全-- 一个简单的 单设备登录 单点登录
  • CST UTC
  • 在CentOS上安装与配置Tomcat
  • Modular Multiplicative Inverse(模乘逆元)
  • 线程同步辅助类——CountDownLatch
  • Java中的并发工具
  • ShareSDK的使用文章
  • Linux查看程序端口占用情况
  • 如何在VS2008中自定义多项目模板
  • 程序员,我们都是夜归人【转】
  • 【架构】微服务系列文章
  • 快速查询Python脚本语法
  • 基础业务集成开发平台(BusinessWorks) - 概要设计篇
  • ES6核心特性
  • JAVA之继承和多态
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Odoo domain写法及运用
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Spring声明式事务管理之一:五大属性分析
  • STAR法则
  • V4L2视频输入框架概述
  • 初识 beanstalkd
  • 反思总结然后整装待发
  • 机器学习学习笔记一
  • 技术:超级实用的电脑小技巧
  • 前端知识点整理(待续)
  • 区块链将重新定义世界
  • 使用 Docker 部署 Spring Boot项目
  • 使用agvtool更改app version/build
  • 硬币翻转问题,区间操作
  • 正则学习笔记
  • 《天龙八部3D》Unity技术方案揭秘
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​香农与信息论三大定律
  • ###STL(标准模板库)
  • $.ajax中的eval及dataType
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (三十五)大数据实战——Superset可视化平台搭建
  • (五)MySQL的备份及恢复
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)ORM
  • ./configure,make,make install的作用
  • ./configure,make,make install的作用(转)
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core 6 redis操作类
  • .NET Framework与.NET Framework SDK有什么不同?
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化