Mock&Mockito使用手册

这篇具有很好参考价值的文章主要介绍了Mock&Mockito使用手册。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基础概念

mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。这个虚拟的对象就是mock对象。mock对象就是真实对象在调试期间的代替品;

Mock 对象:模拟对象的概念就是我们想要创建一个可以替代实际对象的对象,这个模拟对象要可以通过特定参数调用特定的方法,并且能返回预期结果;

Stub 桩:桩指的是用来替换具体功能的程序段。桩程序可以用来模拟已有程序的行为或是对未完成开发程序的一种临时替代;

使用

依赖:

<dependency>  
    <groupId>org.mockito</groupId>  
    <artifactId>mockito-core</artifactId>  
    <version>1.9.5</version>  
    <scope>test</scope>  
</dependency> 

1. Mock 对象

// @InjectMocks注解标注的属性,可以自动注入标记@Mock、@Spy等注解的属性值
public class UserServiceTest {  
  
    @InjectMocks  
    private UserServiceImpl userService;  
  
    @Mock  
    private UserDao mockUserDao;  
  
    @Before  
    public void setUp() {  
        MockitoAnnotations.initMocks(this);  
    }  
}

/* 静态方法Mock */
//mock一个静态类,被测试代码依赖的类
mockStatic(PersonDao.class);
//当调用PersonDao.findStatic()方法,返回特定的值
when(PersonDao.testStatic(Mockito.anyString())).thenReturn("not find");

2. 打桩

设置 Mock 对象期望和返回值

/* 表示第一次调用 someMethod() 返回 value1 第二次调用返回 value2 */
when(mock.someMethod()).thenReturn(value1).thenReturn(value2);  
when(mock.someMethod()).thenReturn(value1, value2);  
/* 也可以设置两次 */
when(mock.someMethod()).thenReturn(value1);
when(mock.someMethod()).thenReturn(value2);

// 其他写法
/* 表示第一次调用 someMethod() 返回 value1 第二次调用返回 value2 */
doReturn(value1).doReturn(value2).when(mock).someMethod();  
/* 若返回 void,则设置为 doNothing() */
doNothing().when(mock).someMethod();

/* void 方法的预期设定 */
doNothing().when(mock).someMethod(); 

/* 方法返回异常 */
when(mock.someMethod()).thenThrow(new RuntimeException()); 

/* 对 void 方法进行方法预期设定 */
doThrow(new RuntimeException()).when(mock).someMethod();

方法设定返回异常

/* 当调用 someMethod() 方法时会抛出异常 */
when(mock.someMethod()).thenThrow(new RuntimeException());
/* 对 void 方法设定 */  
doThrow(new RuntimeException()).when(mock).someMethod();  

参数匹配 any() anyInt()

/*  any(User.class),匹配任意User对象;
    anyString()匹配任意字符串;
    anyInt()匹配任意int型 
*/
when(list.get(anyInt())).thenReturn("hello");

3. 校验

/* 验证方法被调用并且被调用了 1 次 */
verify(mock1).get(0);
mock1.get(0);
/* 验证方法调用两次 */
verify(mock1, times(2)).get(0);
/* 验证方法从未被调用过 */
verify(mock2, never()).get(0);
/* 验证方法 100 毫秒内调用两次 */
verify(mock1, timeout(100).times(2)).get(anyInt());

参考

Mock 官网

Mock工具Mockito教程

Mock 单元测试利器

Mockito 浅谈文章来源地址https://www.toymoban.com/news/detail-508770.html

到了这里,关于Mock&Mockito使用手册的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用mockito来mock final、static、private以及构造方法

    final 方法 mock final方法(2.1版本开始):对final视而不见,和mock 普通方法一样 stati 方法 mock static方法(3.4版本开始): 使用try-with-resource缩小作用范围 构造方法 mock 构造方法(3.5版本开始):使用try-with-resource缩小作用范围 私有方法 mockito 不支持mock私有方法,采用反射的方式

    2024年02月11日
    浏览(37)
  • 测试人必会的Python内置库:unittest.mock(单元测试mock的基础使用)

    unittest.mock是用于在单元测试中模拟和替换指定的对象及行为,以便测试用例更加准确地进行测试运行。例如对于以下代码,想要针对函数func_a写一个简单的单元测试: 但是这样的话,函数func_b和func_c的逻辑都需要一起测试,在单元测试中这明显是不合理的,对于想要测试的

    2024年02月01日
    浏览(43)
  • 记一次 Mockito.mockStatic 泄漏导致的单元测试偶发报错排查过程

    相信用 Java 写过单元测试的读者们对 Mockito 不会陌生。至于 Mockito 是什么,为什么要用 Mockito,本文不再赘述。本文记录了一次在 Apache ShardingSphere 项目中,由 Mockito.mockStatic 使用不当导致的单元测试偶发报错排查过程。 Mockito 自 3.4.0 起新增了一个方法 Mockito.mockStatic ,支持对

    2024年02月10日
    浏览(55)
  • Mockito mock与spy的区别

    ##前言 Mockito是一个强大的mock工具,本文将重点讲述Mockito中mock与spy的区别 mock与spy的区别 mock跟spy都可以用于模拟对象,区别是mock产生的对象,并不会真正的执行对象的行为,而spy创建的对象,会真的去执行对象的行为 示例: 输出: 通过代码示例可以看出,对mockedList的操作

    2024年02月11日
    浏览(37)
  • Mockito无法Mock RedisTemplate解决方案

    如题,在SpringBoot工程中使用@MockBean对RedisTemplate进行Mock时发现报错,RedisTemplate连接工厂为null 当尝试将RedisConnectFaction注入测试类进行Mock后发现依然无效。 所以尝试新的解决方案: 将RedisTemplate使用@Spy注入原始类,在测试运行前对RedisTemplate底层方法进行批量Mock 经过测试后成功

    2024年02月12日
    浏览(54)
  • Mockito 实现原理(3):如何对 final 类进行 mock

    前面两篇提到,Mockito 默认基于创建派生类(subclass)来实现 mock(包括 spy)。 那么问题来了,如果我的类标记为 final,明确禁止创建派生类,那不就没法 mock 了吗? 为了解决这个问题,Mockito 2 中引入了 InlineByteBuddyMockMaker 。和前面讨论过的默认的 SubclassByteBuddyMockMaker 相比,

    2024年02月09日
    浏览(29)
  • Mockito框架下如何优雅的验证调用Mock对象方法的入参

    该文章已同步至个人微信公众号[不能止步],欢迎关注。 在单元测试场景中,一种典型的场景是为了测试某一个类(Component Under Test, 简称CUT)而需要mock其依赖的的类。示例如下: 为了验证CUT业务实现的正确性,通常需要验证传给调用Mock对象的方法的参数的正确性。如果采

    2024年02月09日
    浏览(52)
  • Mock-MOCO使用过程

    一、jar包下载:https://github.com/dreamhead/moco 二、准备mock的json文件 data.json内容: ####GET请求 三、启动命令: 前提是将json文件和jar包放在同一级目录,然后通过命令行的方式在当前目录运行 #解决中文编码问题 #1.-Dfile.encoding=utf-8 解决编码中文展示异常 #2.data.json文件response里也要

    2024年02月15日
    浏览(26)
  • Mockito单元测试基本使用

    本文参考: 【码农教程】手把手教你Mockito的使用 - 掘金 (juejin.cn) java - doReturn().when()与when().thenReturn() - 成长之路 - SegmentFault 思否 单元测试实践篇:Mock_阿里巴巴淘系技术团队官网博客的博客-CSDN博客 阿里是如何进行单元测试培训的?_Hollis Chuang的博客-CSDN博客 【Mockito】Mock

    2024年02月10日
    浏览(48)
  • 【单元测试】Mockito使用详解

    一个单元测试应该有如下特点: 应该是自动化的 应该可以快速运行 每个单元测试不应该依赖其它测试的结果和执行顺序,单元测试框架可以按任意的顺序执行每个测试 每个单元测试不应该依赖数据库,外部文件,或者任何长时间运行的任务。单元测试应该是独立的,不应该

    2024年04月15日
    浏览(84)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包