模拟测试概述

模拟测试概述

目前支持Java语言的Mock测试工具有EasyMock、JMock、Mockito、MockCreator、Mockrunner、MockMaker等,Mockito是一个针对Java的Mocking框架。它与EasyMock和JMock很相似,是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,避免了手工编写Mock对象。但Mockito是通过在执行后校验什么已经被调用,它消除了对期望行为(Expectations)的需要。使用Mockito,在准备阶段只需花费很少的时间,可以使用简洁的API编写出漂亮的测试,可以对具体的类创建Mock对象,并且有"监视"非Mock对象的能力。

Mockito使用起来简单,学习成本很低,而且具有非常简洁的API,测试代码的可读性很高,因此它十分受欢迎,用户群越来越多,很多开源软件也选择了Mockito。要想了解更多有关Mockito的信息,可以访问其官方网站http://www.mockito.org/。在开始使用Mockito之前,先简单了解一下Stub和Mock的区别。相比Easymock,JMock,编写出来的代码更加容易阅读。无须录制mock方法调用就返回默认值是一个很大优势。目前最新的版本是1.9.0。

Stub对象用来提供测试时所需要的测试数据,可以对各种交互设置相应的回应。例如我们可以设置方法调用的返回值等。Mockito中 when(…).thenReturn(…) 这样的语法便是设置方法调用的返回值。另外也可以设置方法在何时调用会抛出异常等。

Mock对象用来验证测试中所依赖对象间的交互是否能够达到预期。Mockito中用 verify(…).methodXxx(…) 语法来验证 methodXxx方法是否按照预期进行了调用。有关stub和mock的详细论述请见Martin Fowler的文章《Mocks Aren't Stub》,地址为http://martinfowler.com/articles/mocksArentStubs.html。在Mocking框架中所谓的Mock对象实际上是作为上述的Stub和Mock对象同时使用的。因为它既可以设置方法调用返回值,又可以验证方法的调用。


创建Mock对象

可以对类和接口进行Mock对象的创建,创建的时候可以为Mock对象命名,也可以忽略命名参数。为Mock对象命名的好处就是调试的时候会很方便。比如,我们Mock多个对象,在测试失败的信息中会把有问题的Mock对象打印出来,有了名字我们可以很容易定位和辨认出是哪个Mock对象出现的问题。另外它也有限制,对于final类、匿名类和Java的基本类型是无法进行Mock的。除了用Mock方法来创建模拟对象,如mock(Class<T> classToMock),也可以使用@mock注解定义Mock,下面我们通过实例来介绍一下如何创建一个Mock对象。代码清单16 8  MockitoSampleTest.java创建Mock对象
import org.junit.Test;  
import org.mockito.Mock;  
import com.baobaotao.domain.User;  
import com.baobaotao.service.UserService;  
import com.baobaotao.service.UserServiceImpl;  
import static org.junit.Assert.*;  
import static org.mockito.Mockito.*;  
import org.mockito.MockitoAnnotations;  

public class MockitoSampleTest{  
       
    //① 对接口进行模拟  
    UserService mockmockUserService = mock(UserService.class);  
    //② 对类进行模拟  
    UserServiceImpl mockmockServiceImpl = mock(UserServiceImpl.class);  
    //③ 基于注解模拟类  
    @Mock  
    User mockUser;  
     
    @Before   
    public void initMocks() {  
    //④ 初始化当前测试类所有@Mock注解模拟对象  
        MockitoAnnotations.initMocks(this);  
    }  

 }  
 
在①处和②处,通过Mockito提供的mock()方法创建UserService 用户服务接口、用户服务实现类UserServiceImpl的模拟对象。在③处,通过@Mock注解创建用户User类模拟对象,并需要在测试类初始化方法中,通过MockitoAnnotations.initMocks()方法初始化当前测试类中所有打上@Mock注解的模拟对象。如果没有执行这一步初始化动作,测试时会报模拟对象为空对象异常



设定Mock对象的期望行为及返回值

从上文中我们已经知道可以通过when(mock.someMethod()).thenReturn(value)来设定Mock对象的某个方法调用时的返回值,但它也同样有限制条件:对于static和final修饰的方法是无法进行设定的。下面我们通过实例来介绍一下如何调用方法及设定返回值。
代码清单16 9  MockitoSampleTest.java设定模拟对象的行为及返回值
import org.junit.Test;  
import org.mockito.Mock;  
import com.baobaotao.domain.User;  
import com.baobaotao.service.UserService;  
import com.baobaotao.service.UserServiceImpl;  

public class MockitoSampleTest {  
     
     //① 模拟接口UserService测试  
    @Test  
    public void testMockInterface() {  
          //①-1 对方法设定返回值      
    when(mockUserService.findUserByUserName("tom")).thenReturn(  
                new User("tom", "1234"));  
    //①-2 对方法设定返回值    
    doReturn(true).when(mockServiceImpl).hasMatchUser("tom", "1234");  
    //①-3 对void方法进行方法预期设定   
    User u = new User("John", "1234");  
    doNothing().when(mockUserService).registerUser(u);  
 
    //①-4 执行方法调用  
        User user = mockUserService.findUserByUserName("tom");  
        boolean isMatch = mockUserService.hasMatchUser("tom","1234");  
         mockUserService.registerUser(u);  
 
        assertNotNull(user);  
        assertEquals(user.getUserName(), "tom");  
        assertEquals(isMatch, true);  
    }  
 
    //② 模拟实现类UserServiceImpl测试  
    @Test  
    public void testMockClass() {  
          // 对方法设定返回值  
        when(mockServiceImpl.findUserByUserName("tom"))  
.thenReturn(new User("tom", "1234"));  
    doReturn(true).when(mockServiceImpl).hasMatchUser("tom", "1234");  
 
        User user = mockServiceImpl.findUserByUserName("tom");  
        boolean isMatch = mockServiceImpl.hasMatchUser("tom","1234");  
        assertNotNull(user);  
        assertEquals(user.getUserName(), "tom");  
        assertEquals(isMatch, true);  
    }  
      
    //③ 模拟User类测试  
    @Test  
    public void testMockUser() {  
        when(mockUser.getUserId()).thenReturn(1);  
        when(mockUser.getUserName()).thenReturn("tom");  
        assertEquals(mockUser.getUserId(),1);  
        assertEquals(mockUser.getUserName(), "tom");  
    }  
 
…在①处,模拟测试接口UserService的findUserByUserName()方法、hasMatchUser()方法及registerUser()方法。在①-1处通过when().thenReturn()语法,模拟方法调用及设置方法的返回值,实例通过模拟调用UserService 用户服务接口的查找用户findUserByUserName()方法,查询用户名为"tom"详细的信息,并设置返回User对象:new User("tom", "1234")。在①-2处通过doReturn (). when ()语法,模拟判断用户hasMatchUser()方法的调用,判断用户名为"tom"及密码为"1234"的用户存在,并设置返回值为:true。在①-3处对void方法进行方法预期设定,如实例中调用注册用户registerUser()方法。设定调用方法及返回值之后,就可以执行接口方法调用验证。在②处和③处,模拟测试用户服务实现类UserServiceImpl,测试的方法与模拟接口一致。




验证交互行为

Mock对象一旦建立便会自动记录自己的交互行为,所以我们可以有选择地对其交互行为进行验证。在Mockito中验证mock对象交互行为的方法是verify(mock). xxx()。于是用此方法验证了findUserByUserName()方法的调用,因为只调用了一次,所以在verify中我们指定了times参数或atLeastOnce()参数。最后验证返回值是否和预期一样。

代码清单16 10 MockitoSampleTest.java验证交互行为
import org.junit.Test;  
import org.mockito.Mock;  
import com.baobaotao.domain.User;  
import com.baobaotao.service.UserService;  
import com.baobaotao.service.UserServiceImpl;  

public class MockitoSampleTest {  
    
 
     //① 模拟接口UserService测试  
    @Test  
    public void testMockInterface() {  
   
    when(mockUserService.findUserByUserName("tom"))  
                         .thenReturn(new User("tom", "1234"));  
    User user = mockServiceImpl.findUserByUserName("tom");  
 
    //①-4 验证返回值  
        assertNotNull(user);  
        assertEquals(user.getUserName(), "tom");  
        assertEquals(isMatch, true);  
 
    //①-5 验证交互行为  
    verify(mockUserService).findUserByUserName("tom");  
 
    //①-6 验证方法至少调用一次  
    verify(mockUserService, atLeastOnce()).findUserByUserName("tom");  
    verify(mockUserService, atLeast(1)).findUserByUserName("tom");  
      
    //①-7 验证方法至多调用一次  
    verify(mockUserService, atMost(1)).findUserByUserName("tom");  
    }  
}
 
Mockio为我们提供了丰富调用方法次数的验证机制,如被调用了特定次数verify(xxx, times(x))、至少x次verify(xxx, atLeast (x))、最多x次verify(xxx, atMost (x))、从未被调用verify(xxx, never())。在①-6处,验证findUserByUserName()方法至少被调用一次。在①-7处,验证findUserByUserName()方法至多被调用一次。
ISTQB-FL-2014软件测试基础模拟试卷 ISTQB(International Software Testing Qualifications Board)是一个国际公认的软件测试资格认证机构,负责制定和推广软件测试相关的资格认证标准。FL-2014指的是Foundation Level认证的2014年版考试大纲。 阅读详情

相关推荐

中国联通SGIP服务端模拟器实用指南

SGIP协议,即Short Message Gateway Interface Protocol,是短信网关接口协议的缩写。它是用于短信服务供应商和运营商之间进行短信传输的标准协议。通过SGIP协议,可以有效地保证短信的快速、准确地发送和接收,对于短信业务在移动通信网络中的广泛应用起到了重要的促进作用。SGIP(Short Message Gateway Interface Protocol)服务端模拟器在SGIP协议测试环境中扮演着至关重要的角色。

weixin_32661831的博客 978

Mockito浅谈

Mockito浅谈Mockito浅谈 Mockito简介 Mock的好处是什么 Mockito使用示例 模拟对象 模拟方法调用的返回值 模拟方法调用抛出异常 模拟调用方法时的参数匹配 模拟方法调用次数 校验行为 模拟方法调用Stubbing 参数匹配 校验方法调用次数 模拟无返回方法抛出异常 校验方法调用顺序 校验方法是否从未调用 快速创建Mock对象 自定义返回不同结果 对返回结果进行拦截 Moc

流水不腐小夏 7346

PearPC模拟器深入解析

PowerPC架构是苹果公司和IBM共同开发的微处理器架构,它基于精简指令集计算机(RISC)体系。这一架构设计高效且灵活性高,非常适合于运行操作系统的高性能计算。PowerPC 架构自20世纪90年代推出以来,在计算机处理器市场占据了一席之地,尤其是在苹果Macintosh产品线中广泛采用。在PowerPC架构中,处理器核心采用先进的流水线设计和超标量技术,这提高了指令执行的速度和效率。此外,PowerPC架构支持多线程和虚拟内存管理,这为运行复杂的应用程序提供了良好的支持。

weixin_42581003的博客 926

Mockito模拟静态方法报错:org.mockito.exceptions.misusing.MissingMethodInvocationException.求解

Mockito模拟静态方法报错:org.mockito.exceptions.misusing.MissingMethodInvocationException.求解

weixin_45990146的博客 4228

【BigWorld 游戏服务器引擎】Cell 架构设计介绍,及Java实现方案的探索

横向扩展(Scalability):通过动态增减CellApp和BaseApp的数量,可以轻松应对玩家人数的变化。世界可以做得非常大,只需增加更多的 Cell。负载分离(Load Separation):将不同性质的负载分离,避免了单一进程瓶颈。CPU 密集型的实时计算(CellApp)和 I/O 密集型的数据操作(BaseApp)互不影响。高效的视野管理(AOI):每个 Cell 只关心自己区域内和边界上的实体,大大降低了计算复杂度。容错性:某个CellApp。

代码时光 1205

Pixel 5 Root, 安装Xposed框架, 解锁5G教程

Pixel 5 5G手机root 教程 前几天买的手机终于到货了,现在又开始折腾了,经过我的努力,现在已经拥有root权限了。

Ender_Zhao的博客 3万+

mockito框架比jmock好用多了!!

Sorry iteye有问题吧 我一提交怎么产生两个帖子了,不好意思啊!     引述:程序测试对保障应用程序正确性而言,其重要性怎么样强调都不为过。JUnit是必须事先掌握的测试框架,大多数测试框架和测试工具都在此基础上扩展而来,Spring对测试所提供的帮助类也是在JUnit的基础上进行演化的。直接使用JUnit测试基于Spring的应用存在诸多不便,不可避免地需要将大量的精力用于应付测试夹

legend_x的专栏 4082

手把手教你解决CentOS sshd启动报错:从权限问题到目录缺失的全套解决方案

本文提供了一套完整的CentOS SSH服务启动故障排查与修复方案。针对sshd启动报错,从systemd日志分析、sshd -t配置测试入手,详细解决了私钥文件权限过宽(如0644错误)和权限分离目录缺失等典型问题,并附带了扩展排查清单,帮助运维人员系统性地定位和解决连接故障。

weixin_29248611的博客 152

mock浅析

因为今天在牛壳网上刷一道题,看到了mock,不知道是什么,所以写一篇博文。 mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。 mock对象使用范畴 真实对象具有不可确定的行为,产生不可预测的效果,(如:股票行情,天气预报)真实对象很难被创建的 真实对象的某些行为很难被触发真实对象实际上还不存在的(和其他开发小组或者和新的硬件打交

Csoul89757 1090

YOLOv8改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进

1️⃣本专栏已更新150多种不同的改进方法,所使用并改进的每一个模块均包含详细的模块分析、原理讲解、个人总结、多种改进方式以及完整的修改流程,所有改进100%可直接运行。2️⃣所有改进点均为近三年顶会,顶刊提出的先进算法,将其融入到中,紧跟学术热点,适应不同的任务场景。3️⃣团队内发表数篇SCI论文,熟悉完整的发表流程,订阅专栏即可进群享受模型训练、模型改进、论文写作、投稿选刊,从入门到论文的各种答疑内容。4️⃣专栏内容会持续更新,最近更新时间:2024-12-24。项目介绍在大家购买专栏后,加入学

Limiiiing的博客 1万+

【vsomeip3 教程】SOME/IP中间件去抖策略全解析

本文探讨了在SOME/IP中间件中实现Debounce(去抖动)机制的必要性和实现原理。文章首先分析了中间件层进行Debounce的四大动机:多订阅者共享收益、语义显式化、协议噪声屏蔽和入口处背压控制。接着详细阐述了Debounce的底层原理,包括变化检测机制(ignore和mask的应用)、时间门控策略(interval的两种时间基准)以及超时补发机制,并通过表格清晰展示了不同参数组合的效果和适用场景。最后,文章提出了工程落地的具体方法,包括策略选型、ignore/mask的设计方法论以及分层验证调试的实

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 232

单元测试如何模拟用户请求

错误: 正当我高高兴兴写完后台c层的测试代码准备提交时,测试机器人报了很多401错误,把代码拉下来一看,原来当我写代码时,我的伙伴已经写好后台的拦截器了,只有绑定了token的用户才能访问后台,所以当我单元测试c层模拟请求时就会报错, 因为我的模拟前台请求就像是一个没有登陆的用户请求,经过拦截器必然是被拦截了下来。 解决经过 一开始有点不知所错。我们的模拟请求失败是因为后台在没有绑定token的情况下请求了其他接口,而我们的拦截器也没有发token给模拟请求。我们正常要使用系统的话要先登录,第一次登录的

Asaasa1的博客 1137

YOLOv8改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用

本文记录的是利用双级路由注意力机制优化的目标检测网络模型。传统的复杂度高,随着输入空间分辨率增加,计算量呈平方增长,导致严重的可扩展性问题。而本文所使用的在获取全局信息的同时,通过区域到区域路由和令牌到令牌注意力的合理设计,减少了不必要的计算量。BiFormer: Vision Transformer with Bi-Level Routing Attention采用四阶段金字塔结构,与一些先进的视觉Transformer类似。在每个阶段,首先使用重叠的补丁嵌入(在第一阶段)或补丁合并模块(在第二到第四阶段

Limiiiing的博客 614

测试信号处理-模拟滤波器概述

模拟滤波器概述 略略略 经典滤波器原理 1. 术语和概念 h(t),H(s),H(jΩ)h(t),H(s),H(j\Omega)h(t),H(s),H(jΩ)分别为单位冲击响应,传输函数,频率响应函数。 h(n),H(z),H(jΩ)h(n),H(z),H(j\Omega)h(n),H(z),H(jΩ)单位抽样响应,转移函数,频率响应函数。 模拟滤波器转换为数字滤波器会在频域上有个延拓(N点,2pi周期) 不失真传输 y(t)=Kx(t−τ)y(t)=Kx(t-\tau)y(t)=Kx(t−τ)

qq_42968558的博客 2426

钢结构焊接连接工艺

钢结构焊接连接工艺

wwdoffice950426的博客 61

Oracle 查看 rman 备份情况 SQL 语句

每天一个 DBA 小知识,助你更进一步!

LuciferLiu_DBA 3119

P2P模拟器

P2P网络在规模上能够扩展到很大,网络异构性也很高,而且加入p2p网络的计算机在带宽、存储容量、计算能力上有巨大的差异。并且,p2p网络的工作涉及用户计算机、物理网络、应用层覆盖网、P2P协议和最高层的用户,多层得复杂性导致: 如果要在真实环境中实际运行,测试一个p2p网络需要付出巨大的努力,通常是不可取的; 反而,使用模拟的方法忽略掉一些不必要和不关心的细节,在可控的环境中测试、评价一个P2P网络,不仅方便、易实现,且结果常常能更公平(可以基于统一模拟器测试多种p2p协议)。 但长久以来没有得到重视

云里雾里的专栏 2524

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

cancase vector_基于Vector总线设备的CAN总线测试方法概述

3.3采样点位置测试测试设备:CANoe、CANStressDR。测试系统架构中需将CANScope旁路处理。测试设备正确接线后(CANStressDR串接在回路中),CANoe发送报文,CANStressDR采用位干扰的方式进行干扰,具体是采用CANStressDR从后往前逐位干扰某一报文,直至CANoe监测出现错误帧,如图5所示,然后用公式计算出采样点位置SamplePoint=m/nx 10...

weixin_33593741的博客 5010

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java实现安卓手机模拟操作

硬件层:触摸屏、物理按键等硬件设备产生原始输入信号内核层:Linux内核通过设备驱动接收原始输入事件系统服务层:InputManagerService处理输入事件应用层:事件通过View层级传递到具体应用本文详细介绍了使用Java实现安卓手机模拟操作的各种技术和方法,从基础的单点触摸、按键模拟到复杂的多指手势、无障碍服务实现,涵盖了开发过程中可能遇到的多种场景和需求。明确告知用户应用将执行的操作获取用户的明确授权仅在必要的情况下使用这些技术。

百锦再的博客 1万+

车载毫米波雷达测试(1)_关于雷达的目标检测性能测试与雷达模拟器

本博文梳理了关于雷达目标检测性能测试的内容,包括需要测试的参数、测试的环境、设备以及流程方法,更具体的细则还需要读者去到征求意见稿中的6.3节进行研读,内容相对简单,但是较为繁琐没有放在本博文的内容里了。此外,本文还对雷达目标模拟器这一重要的测试设备进行了介绍。

xhblair的博客 6045

期货交易策略模拟测试-基于CLBISO01策略-2023.12.22

采取与昨天同样的策略进行盘中模拟测试,今天行情还可以,挺“顺溜”。

u011490194的专栏 495

Mockito实战:轻松掌握Java单元测试中的模拟对象技术

Mockito是一个流行的Java模拟框架,它允许开发者在单元测试中创建和管理模拟对象(MockObjects)。这些模拟对象可以替代真实的依赖项,如数据库访问层(DAO)、服务层(Service)或存储库(Repository),使得测试能够专注于验证被测代码的业务逻辑,而无需启动实际的数据库连接、发送网络请求等外部资源。简洁的API:提供易于理解和使用的API,使得创建和管理模拟对象变得简单快捷。灵活的验证机制:支持多种验证方式,如验证方法调用次数、参数匹配等,确保测试结果的准确性。

zhangkexin_z的博客 985

UI自动化测试与接口自动化测试区别

1、UI自动化测试基本流程 (1)进行元素定位 (2)模拟手动操作 (3)输入测试数据 (4)获取输出结果 2、接口自动化测试基本流程 (1)模拟发送请求 (1)传入接口数据 (1)获取响应结果 总结:UI自动化就是模拟用户手工操作,获取界面的输出结果 接口自动化就是模拟发送请求,获取响应结果 ...

weixin_51929716的博客 6063

postman去模拟登陆接口

postman去模拟登陆接口 2018-05-08 10:21:33Destiny_Chm阅读数 7769收藏更多 分类专栏:工作 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.youkuaiyun.com/qq_22219911/article/details/80235272 创作目的: ...

cxu123321的博客 2022

APP测试

APP特征:设备多样性,网络多样性,平台多样性APP测试与PC端软件测试的区别:页面布局不同,使用场合不同,输入方法不同,操作方式不同APP测试环节:接收测试版本,APP版本测试,UI测试,功能测试,专项测试,正式环境测试,上线准备。

m0_73755884的博客 1126

【Rust日报】2023-11-13 异步 Rust 中的模拟测试

异步 Rust 中的模拟测试这篇文章介绍了在异步 Rust 中进行模拟测试(mocking)的方法。文章分为三个部分:简单模拟测试:通过使用 mockall crate,作者展示了如何对同步代码进行简单的模拟测试。异步模拟测试不当的例子作者介绍了在处理异步代码时,如果不注意宏的调用顺序,可能会导致复杂的代码和 Future 类型的实现。正确的异步模拟测试方法:作者提出了解决异步模拟测试困境的更好方...

Rust语言学习交流 206
上一篇: 使用序列化类的私有方法巧妙解决部分属性持久化问题
下一篇: Unitils概述
gufengjava
博客等级 码龄16年 1粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值