百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Mock & Mockito是什么,怎么用?

itomcoil 2025-07-06 12:57 2 浏览

Mock & Mockito

mock 即模拟对象,而Mockito是在github上开源的一个优秀的用于单元测试的mock框架。

什么是Mock

mock是测试替身的一种。测试替身即一些功能较为简单的并且其行为和实际对象类似的假对象

之所以需要测试替身,是因为一个实际的系统会依赖多个外部对象, 但是在进行单元测试时我们需要降低单元测试的复杂性和可实现性,而测试替身很好地解决了这一问题。

测试替身共有5中类型,Mock object就是其中的一种。其用于模拟实际的对象, 并校验对这个 Mock object 的方法调用是否符合预期。

简单来说,Mock 是假的对象,但你可以指定它的行为,比如: - 调用方法返回指定值。 - 记录是否被调用、调用了几次、参数是什么。

从而避免真的访问数据库、网络、文件等外部资源。

Mockito

什么是Mockito

Mockito 可以创建和配置 Mock 对象, 进而简化有外部依赖的类的测试。

举例来讲,当我们要测试一个类,例如AdministratorServiceImpl。而该类又依赖于AdministratorMapper,那么就可以通过注解“@Mock”来使用一个区别于原本AdministratorMapper的具有相同功能的mock对象。

由于mock会无中生有地生出一个完全虚拟的对象, 它的所有方法都是虚拟的。在这种情况下,我们就可以对 AdministratorServiceImpl 进行测试, 而不需要关注它的复杂的依赖了。

使用方法

使用 Mockito 的基本流程如下: 1. 创建外部依赖的 Mock 对象, 然后将此 Mock 对象注入到测试类中; 2. 执行测试代码; 3. 校验测试代码是否执行正确。

在java项目中使用时,通过maven引入依赖的方法如下:

    org.mockito    mockito-core    5.10.0    test

使用示例代码:

@ExtendWith(MockitoExtension.class)class UserControllerTest {    @Mock    private UserService userService;    @InjectMocks    private UserController userController;    @Test    void testGetUserById() {        User mockUser = new User(1, "张三");        when(userService.getUserById(1)).thenReturn(mockUser);        User result = userController.getUser(1);        assertEquals("张三", result.getName());        verify(userService).getUserById(1);    }}

其中 @InjectMocks 用于注解被注入mock类的测试类,@Mock 用于注解需要mock的类(即依赖项)。

使用mock对象的过程和使用真实对象是一致的。最终验证调用使用的是verify方法,例:

verify(userService).getUserById(1); // 验证是否调用了该方法verify(userService, times(1)).getUserById(1); // 验证调用了一次

常用的注解还有:

mockito常用注解

在实际开发中的使用示例如下:

public class AdministratorServiceImplTest {      @InjectMocks      private AdministratorServiceImpl administratorService;      @Mock      private AdministratorMapper administratorMapper;      @BeforeEach      void setUp() {          // 初始化 Mockito 注解          MockitoAnnotations.openMocks(this);      }      // ---------- getAdminByName ----------      @Test      void testGetAdminByName_Success() {          Administrator mockAdmin = new Administrator();          mockAdmin.setAdminName("admin");          when(administratorMapper.selectOne(any(QueryWrapper.class))).thenReturn(mockAdmin);          Administrator result = administratorService.getAdminByName("admin");          assertEquals("admin", result.getAdminName());      }      @Test      void testGetAdminByName_EmptyName() {          assertErrorCode(() -> administratorService.getAdminByName(""), ErrorCodes.INVALID_PARAMETER);      }      @Test      void testGetAdminByName_NotFound() {          when(administratorMapper.selectOne(any(QueryWrapper.class))).thenReturn(null);          assertErrorCode(() -> administratorService.getAdminByName("unknown"), ErrorCodes.NOT_FOUND);      }      // ---------- updatePassword ----------      @Test      void testUpdatePassword_Success() {          Administrator admin = new Administrator();          admin.setAdminId(1L);          admin.setAdminPassword("old");          when(administratorMapper.selectById(1L)).thenReturn(admin);          when(administratorMapper.updateById(any())).thenReturn(1);          boolean result = administratorService.updatePassword(1L, "newPwd");          assertTrue(result);          assertEquals("newPwd", admin.getAdminPassword());      }      @Test      void testUpdatePassword_InvalidId() {          assertErrorCode(() -> administratorService.updatePassword(0L, "pwd"), ErrorCodes.INVALID_PARAMETER);      }      @Test      void testUpdatePassword_EmptyPassword() {          assertErrorCode(() -> administratorService.updatePassword(1L, "  "), ErrorCodes.INVALID_PARAMETER);      }      @Test      void testUpdatePassword_AdminNotFound() {          when(administratorMapper.selectById(1L)).thenReturn(null);          assertErrorCode(() -> administratorService.updatePassword(1L, "pwd"), ErrorCodes.NOT_FOUND);      }      // ---------- getAllAdministrators ----------      @Test      void testGetAllAdministrators() {          List<Administrator> mockList = Arrays.asList(new Administrator(), new Administrator());          when(administratorMapper.selectList(any())).thenReturn(mockList);          List<Administrator> result = administratorService.getAllAdministrators();          assertEquals(2, result.size());      }      // ---------- doLogin ----------      @Test      void testDoLogin_NullInput() {          assertNull(administratorService.doLogin(null));      }      @Test      void testDoLogin_EmptyFields() {          Administrator a = new Administrator();          assertNull(administratorService.doLogin(a));      }      @Test      void testDoLogin_NotFound() {          Administrator input = new Administrator();          input.setAdminName("admin");          input.setAdminPassword("123");          when(administratorMapper.selectList(any())).thenReturn(Collections.emptyList());          assertNull(administratorService.doLogin(input));      }      @Test      void testDoLogin_PasswordMismatch() {          Administrator input = new Administrator();          input.setAdminName("admin");          input.setAdminPassword("wrong");          Administrator dbAdmin = new Administrator();          dbAdmin.setAdminName("admin");          dbAdmin.setAdminPassword("correct");          when(administratorMapper.selectList(any())).thenReturn(List.of(dbAdmin));          assertNull(administratorService.doLogin(input));      }      @Test      void testDoLogin_Success() {          Administrator input = new Administrator();          input.setAdminName("admin");          input.setAdminPassword("123");          Administrator dbAdmin = new Administrator();          dbAdmin.setAdminName("admin");          dbAdmin.setAdminPassword("123");          when(administratorMapper.selectList(any())).thenReturn(List.of(dbAdmin));          Administrator result = administratorService.doLogin(input);          assertNotNull(result);          assertEquals("admin", result.getAdminName());      }      private void assertErrorCode(Runnable runnable, int expectedCode) {          BusinessException exception = assertThrows(BusinessException.class, runnable::run);          assertEquals(expectedCode, exception.getCode());      }  }

相关推荐

zabbix企业微信告警(zabbix5.0企业微信告警详细)

zabbix企业微信告警的前提是用户有企业微信且创建了一个能够发送消息的应用,具体怎么创建可以协同用户侧企业微信的管理员。第一步:企业微信准备我们需要的内容包括企业ID,应用的AgentId和应用的S...

基于centos7部署saltstack服务器管理自动化运维平台

概述SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCr...

功能实用,效率提升,Python开发的自动化运维工具

想要高效的完成日常运维工作,不论是代码部署、应用管理还是资产信息录入,都需要一个自动化运维平台。今天我们分享一个开源项目,它可以帮助运维人员完成日常工作,提高效率,降低成本,它就是:OpsManage...

centos定时任务之python脚本(centos7执行python脚本)

一、crontab的安装默认情况下,CentOS7中已经安装有crontab,如果没有安装,可以通过yum进行安装。yuminstallcrontabs二、crontab的定时语法说明*代表取...

Fedora 41 终于要和 Python 2.7 说再见了

红帽工程师MiroHroncok提交了一份变更提案,建议在Fedora41中退役Python2.7,并放弃仍然依赖Python2的软件包。Python2已于2020年1...

软件测试|使用docker搞定 Python环境搭建

前言当我们在公司的电脑上搭建了一套我们需要的Python环境,比如我们的版本是3.8的Python,那我可能有一天换了一台电脑之后,我整套环境就需要全部重新搭建,不只是Python,我们一系列的第三方...

环境配置篇:Centos如何安装Python解释器

有小伙伴时常会使用Python进行编程,那么如何配置centos中的Python环境呢?1)先安装依赖yuminstallgccgcc-c++sqlite-devel在root用户下操作:1...

(三)Centos7.6安装MySql(centos8.3安装docker)

借鉴文章:centos7+django+python3+mysql+阿里云部署项目全流程。这里我只借鉴安装MySql这一部分。链接:https://blog.csdn.net/a394268045/a...

Centos7.9 如何安装最新版本的Docker

在CentOS7.9系统中安装最新版本的Docker,需遵循以下步骤,并注意依赖项的兼容性问题:1.卸载旧版本Docker(如已安装)若系统中存在旧版Docker,需先卸载以避免冲突:sudoy...

Linux 磁盘空间不够用?5 招快速清理文件,释放 10GB 空间不是梦!

刚收到服务器警告:磁盘空间不足90%!装软件提示Nospaceleftondevice!连日志都写不进去,系统卡到崩溃?别慌!今天教你5个超实用的磁盘清理大招,从临时文件到无用软件一键搞定...

Playwright软件测试框架学习笔记(playwright 官网)

本文为霍格沃兹测试开发学社学员学习笔记,人工智能测试开发进阶学习文末加群。一,Playwright简介Web自动化测试框架。跨平台多语言支持。支持Chromium、Firefox、WebKit...

为SpringDataJpa集成QueryObject模式

1.概览单表查询在业务开发中占比最大,是所有CRUDBoy的入门必备,所有人在JavaBean和SQL之间乐此不疲。而在我看来,该部分是最枯燥、最没有技术含量的“伪技能”。1.1.背景...

金字塔测试原理:写好单元测试的8个小技巧,一文总结

想必金字塔测试原理大家已经很熟悉了,近年来的测试驱动开放在各个公司开始盛行,测试代码先写的倡议被反复提及。鉴于此,许多中大型软件公司对单元测试的要求也逐渐提高。那么,编写单元测试有哪些小技巧可以借鉴和...

测试工程师通常用哪个单元测试库来测试Java程序?

测试工程师在测试Java程序时通常使用各种不同的单元测试库,具体选择取决于项目的需求和团队的偏好。我们先来看一些常用的Java单元测试库,以及它们的一些特点:  1.JUnit:  ·描述:JUn...

JAVA程序员自救之路——SpringAI评估

背景我们用SpringAI做了大模型的调用,RAG的实现。但是我们做的东西是否能满足我们业务的要求呢。比如我们问了一个复杂的问题,大模型能否快速准确的回答出来?是否会出现幻觉?这就需要我们构建一个完善...