# Moco使用心得分享 | 大染志
Moco是个什么东西呢？Moco是Thoughtworker @Dreamhead 写的一个用于Mock服务和和进行相关测试的框架。在Moco的官方介绍中是这样描述的：“Moco is an easy setup stub framework, mainly focusing on testing and integration, inspired by Mock framework, e.g.

大染志

Junv's blog

# Moco使用心得分享

发表于 2013-06-13 更新于 2026-08-04

##### Moco是个什么东西呢？

Moco是Thoughtworker @Dreamhead 写的一个用于Mock服务和和进行相关测试的框架。在Moco的官方介绍中是这样描述的：“Moco is an easy setup stub framework, mainly focusing on testing and integration, inspired by Mock framework, e.g. Mockito, and Playframework。”在我要讲的这个应用中，我们主要用Moco来mock第三方、应用外部的服务。保障我们进行高效和稳定的开发。

##### 为什么我们要使用Moco：

我们的应用主要的数据来源和持久化等操作都不是在应用内完成，而主要是通过调用外部的Web service来达到目的。在使用Moco之前我们经常遇到这样的问题，外部的服务挂了，我们本地获取不到数据，就直接导致我们不能进行开发工作，集成测试不工作，就导致我们不能验证自己的工作是否是正确的。我们就期望有一个东西，能在我们进行开发时，屏蔽我们对外部外部的高度依赖。然后我们只需要通过每天定期跑集成测试，以保证我们的工作是正常的，有效的。Moco则满足我们的条件，于是我们在项目中加入了Moco。

##### 我们如何使用Moco：

Moco可以使用java代码API和外挂json配置文件两种形式进行使用，在我们项目中我们使用后者的方法，这样可以保持项目本身和Moco的低耦合，我们只需要在我们需要Moco的时间段——functional test、验收测试段让其加入进来即可。

我们将Moco和外部服务的 base domain（域和端口）写入到一个配置文件中，我们可以根据我们的需要在自行选择是否使用Moco来mock服务。
然后我们需要为被mock的每个服务的endpoint编写监听请求和回应。一个简单的例子如下：

    1
    2
    3
    4
    5
    6
    7
    8
    9

    {
            "request": {
                "method": "get",
                "uri": "/hello"
            },
            "response": {
                "file": "xml-folder/sample.xml"
            }
        }

其大致的意思是：监听“/hello” 这样的GET请求，一旦收到这样的请求即返回某目录下的一个xml文件。

在运行 functional test的时候，我们也使用了Moco来代替真实服务。也许你会问这样做能保证做出来的功能正确吗？答案是肯定的。
首先Moco中所有的数据都是真实的，只是它是某次请求的数据，因此它是固定的。其次我们在项目中每天定期跑集成测试，集成测试保证了我们调用外部服务的接口是正常工作的，数据是准确的。

Moco给我们的优点或者说给我们带来的好处：

- 集成简单、方便，隔离开发对外部服务的高度依赖，使得我们在任何时间都能进行开发，即使所依赖的服务挂了。
- 与Maven、Gradle良好集成，有maven和Gradle插件为我们保驾护航，使得我们可以在Concoridion Test等中轻松使用Moco
- 使得我们的测试运行速度更快，经测试单个接口请求和响应时间至少减少50%以上，节省程序员等待CI状态的时间。

更详细的Moco使用说明，请移步Moco Github repo

0%