当前位置:首页 > 技术 > 正文内容

JUnit与Mockito面试题及核心概念解析

访客 技术 2026年7月20日 1
  1. 什么是单元测试?为何需要编写?

  • 单元测试用于验证代码中最小可测试单元的正确性,通常针对具体方法进行验证。
  • 核心价值:提升代码可靠性,降低缺陷率,简化后期维护。
  • 常用工具:JUnit(测试框架),Mockito(模拟依赖)。
  1. JUnit常用注解及其功能

注解 说明
@测试 标记方法为测试用例
@准备 每个测试前执行
@清理 每个测试后执行
@全局准备 所有测试前执行(需静态方法)
@全局清理 所有测试后执行(需静态方法)
@名称("测试用例") 定义测试名称
@禁用 跳过该测试
  1. JUnit常用断言方法

断言方法 功能
断言相等(预期值, 实际值) 验证数值一致性
断言真(条件) 验证条件为真
断言假(条件) 验证条件为假
断言非空(对象) 验证对象不为空
断言抛出(异常类型, () -> ...) 验证异常触发
  1. Mockito框架的作用与优势

  • Mockito是Java语言的模拟工具,通过替代依赖对象实现被测类的独立验证。
  • 优势:提升测试速度,避免外部系统依赖(如数据库、接口)。
  1. @Mock、@注入和@部分模拟的区别

注解 功能
@Mock 创建完整模拟对象
@注入 将模拟对象注入目标实例
@部分模拟 包装真实对象并选择性模拟
  1. 模拟方法返回值与异常处理

when(模拟对象.方法()).thenReturn(结果);      // 定义返回值
doReturn(结果).when(部分模拟对象).方法();         // 用于部分模拟或void方法
doThrow(新异常()).when(模拟对象).方法(); // 模拟异常抛出

  1. 验证方法调用记录

verify(模拟对象).方法();                      // 验证方法被调用
verify(模拟对象, times(2)).方法();            // 验证调用次数
verify(模拟对象, never()).方法();             // 验证未被调用

  1. 模拟对象与桩对象的区别

  • 桩对象:仅返回预设数据;无法验证交互行为。
  • 模拟对象:可定义行为并验证调用记录。
  1. 私有方法测试方案

  • 推荐方式:通过公共方法间接测试私有逻辑。
  • 不推荐:使用反射直接访问私有方法。
  1. 异常逻辑测试方法

使用JUnit:

断言抛出(非法参数异常.class, () -> 服务类.方法());

使用Mockito:

doThrow(新非法参数异常()).when(模拟对象).方法();

  1. AAA测试模式详解

步骤 含义
准备 初始化测试环境与模拟对象
执行 触发被测方法
断言 验证结果与预期是否一致
  1. 单元测试编写规范

  • 每个测试用例聚焦单一功能
  • 保持测试独立性与可重复性
  • 避免真实外部依赖(使用模拟)
  • 覆盖边界条件与异常场景
  1. 控制器类测试实践

通过MockMvc模拟HTTP请求并验证响应结果:

mockMvc.perform(请求("/api/用户/1"))
       .andExpect(状态().等于200))
       .andExpect(JSON路径("$.名称").等于("艾米"));

核心Mockito使用模式

@Mock        // 创建模拟实例
@InjectMocks // 注入依赖到目标对象
when(...).thenReturn(...) // 定义模拟行为
verify(...)  // 验证交互记录

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。