走进Java接口测试之Mock(概念篇)

简介: 本文分场景介绍了两种 Mock 方式,对于Mock Server 的方案各有各的便利性,看起来都是对接口的模拟。

一、引言

实际工作中,测试人员可能会遇到如下情况:

  • 场景一:依赖接口不通,甲开发A模块,乙开发B模块,甲的进度比乙快,但A模块的方法依赖于B模块,要测试A模块接口怎么办?
  • 场景二:异常数据难模拟,当需要测试接口一些异常数据,接口正常情况是否无法提供异常数据的。那么如何简便地构造接口的异常数据?
  • 场景三:依赖接口性能参数无法保障。在对接口性能压测的时候,需要下游接口及时返回数据,满足上游接口的调用频度。在依赖接口多的情况下,如何减轻工作量?

    二、Mock 的定义

在接口测试过程中,对于某些不容易构造或者不容易获取的对象,我们常常会用一个虚拟的对象代替以便测试。在具体的测试过程中,我们经常会碰到需要模拟数据或者接口的情况,因为环境问题或者系统复杂度的问题,我们需要使用 Mock 方式进行数据的模拟。
引用淘宝网《接口测试白皮书》中的对 Mock 的定义:

Mock 是指使用各种技术手段模拟出各种需要的资源以供测试使用。
被 Mock 的资源通常有以下特征:

  • 被测目标依赖该资源
  • 该资源可能因为各种原因不稳定、返回结果不断变化或者并不总是能够获取到
  • 该资源跟被测目标本身质量无关
  • 这些资源可能是一个外部或底层接口、一个系统、一组数据对象或者是一整套目标软件的工作环境等。通过 Mock 避免对外部真实资源的依赖实现对被测目标的孤立测试,从而大大降低测试的难度,节约测试成本。
  • 需要注意的是利用 Mock 通过的测试与使用真实环境通过的测试毕竟还是有一定差别的。有些时候我们就是需要所测试的系统能够处理依赖所产生的各种情况,包括正常情况和异常情况,我们同样不能保证我们的Mock 可以模拟到每种这样的情况。因此只在确实有必要的情况下才运用Mock。

    三、Mock 的分类

    目前主要应用两大类 Mock 的场景。
    一种是 Mock 一个对象,写入一些预期的值,通过它进行自己想要的测试。主要适用于单元测试,哪种语言开发的程序必须用基于哪种语言的Mock 方案去实现。
    例如:Mockito 只能针对 Java ,适用范围:单测

另外一种就是 Mock 一个 Server ,构造一个假的服务返回预期的结果,也是为了进行自己的测试。主要适用于接口&性能测试,Mock 方案和程序使用的语言无关,可以用 Java 实现,也可以用 Python 实现等,例如:搭建一个 Mock Server,适用范围:无限制

这两个场景构造了大部分的 Mock 使用范围。

四、Mock 一个对象

此处使用Mockito示例

Mockito 是 GitHub 上使用最广泛的 Mock 框架,并与 JUnit 结合使用。Mockito 框架可以创建和配置 mock 对象。使用 Mockito 简化了具有外部依赖的类的测试开发。

在这里插入图片描述
一般使用 Mockito 的步骤:

  1. 模拟任何外部依赖并将这些模拟对象插入测试代码中
  2. 执行测试中的代码执行测试中的代码
  3. 验证代码是否按照预期执行验证代码是否按照预期执行

引入pom

  <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <version>1.10.19</version>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.14.3</version>
        </dependency>

新建测试类,构造了 list 这样的对象,并且给一个元素赋值 zuozewei。在最后断言的时候,也可以通过这个 list 里面确实有这个值。所以,通过这种方式,我们可以进行对象构造。可以是类,也可以是接口。
除了构造对象,当然也可以对方法设定的返回值指定异常。
上述代码的意思就是当调用 list 的第二个元素的时候,抛出一个运行异常。

public class SimpleTest {
   

    @Test
    public void test(){
   
        // 创建Mock对象,参数可以是类或者接口
        List<String> list = mock(List.class);

        //设置方法的预期返回值
        when(list.get(0)).thenReturn("zuozewei");
        when(list.get(1)).thenThrow(new RuntimeException("test exception"));

        String result = list.get(0);

        //验证方法调用
        verify(list).get(0);

        //断言,list的第一个元素是否是"zuozwei"
        Assert.assertEquals(result,"zuozewei");

    }
}

上面只是列举了 Mockito 的简单用法。对于比较复杂的用法,大家可以通过官网深入学习。因为 Mockito 主要用于单元测试,开发人员用的比较多,所以大家有兴趣可以自行了解。

五、Mock Server

下图很好的解释了Mock Server 位置和作用:
在这里插入图片描述
常见的Mock Server

  1. WireMock,支持HTTP协议,参考:http://wiremock.org/
  2. SoapUI MockService 支持 WebService,参考:https://www.soapui.org/
  3. Dubbo,需要自己实现
  4. 使用现成的 Mock Server 库创建系统,参考:
    MockServer:https://github.com/jamesdbloom/mockserver
    Moco:https://github.com/dreamhead/moco
    两个项目都不错有 Mock Serve r库,GitHub 上面的 Star 也差不多。

六、小结

本文分场景介绍了两种 Mock 方式,对于Mock Server 的方案各有各的便利性,看起来都是对接口的模拟。

目录
相关文章
|
2月前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
188 3
|
16天前
|
存储 Java 程序员
Java的基础概念一
### Java编程基础简介 #### 一、注释 注释用于解释代码,不会参与编译和运行。Java支持三种注释: - **单行注释**:以 `//` 开头。 - **多行注释**:以 `/* ... */` 包围。 - **文档注释**:通常用于生成开发文档。 #### 二、关键字 关键字是被Java赋予特定含义的英文单词,全部小写,且在代码编辑器中有特殊颜色标记。常用的如 `class` 表示定义一个类。
Java的基础概念一
|
2月前
|
Java
在Java中如何实现接口?
实现接口是 Java 编程中的一个重要环节,它有助于提高代码的规范性、可扩展性和复用性。通过正确地实现接口,可以使代码更加灵活、易于维护和扩展。
195 64
|
2月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
164 57
|
6天前
|
Java 数据安全/隐私保护
Java的基础概念(二)
本文介绍了Java编程语言中的运算符和表达式,涵盖算术运算符、赋值运算符、关系运算符、逻辑运算符、三元运算符等。重点讲解了算术运算符的使用,如加减乘除取余,并强调了整数除法和取余的特殊性。同时,详细说明了隐式转换与强制转换的概念及应用场景,以及字符串和字符的拼接规则。通过多个案例演示了不同运算符的实际应用,包括数值拆分、自增自减、三元表达式的使用等。最后简要提及了运算符的优先级,指出小括号具有最高优先级。
|
22天前
|
监控 JavaScript 测试技术
postman接口测试工具详解
Postman是一个功能强大且易于使用的API测试工具。通过详细的介绍和实际示例,本文展示了Postman在API测试中的各种应用。无论是简单的请求发送,还是复杂的自动化测试和持续集成,Postman都提供了丰富的功能来满足用户的需求。希望本文能帮助您更好地理解和使用Postman,提高API测试的效率和质量。
78 11
|
2月前
|
Java
在Java中实现接口的具体代码示例
可以根据具体的需求,创建更多的类来实现这个接口,以满足不同形状的计算需求。希望这个示例对你理解在 Java 中如何实现接口有所帮助。
93 38
|
19天前
|
数据采集 JSON Java
利用Java获取京东SKU接口指南
本文介绍如何使用Java通过京东API获取商品SKU信息。首先,需注册京东开放平台账号并创建应用以获取AppKey和AppSecret。接着,查阅API文档了解调用方法。明确商品ID后,构建请求参数并通过HTTP客户端发送请求。最后,解析返回的JSON数据提取SKU信息。注意遵守API调用频率限制及数据保护法规。此方法适用于电商平台及其他数据获取场景。
|
25天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
47 6
|
2月前
|
Java API
Java中内置的函数式接口
Java中内置的函数式接口
33 2
下一篇
开通oss服务