如何使用单元测试JUnit与Mockito框架平滑 mock掉外部未装配接口

梦敏姑娘_7922

梦敏姑娘_7922

2026-06-08

225人浏览

原创

纯单元测试用@mock+@injectmocks,不启spring容器;集成测试用@mockbean替换容器bean。前者快且隔离强,后者适用于需spring环境的controller等场景。

如何使用单元测试junit与mockito框架平滑 mock掉外部未装配接口

核心是用 @Mock 或 @MockBean 创建虚拟依赖,再通过 stubbing 设定返回值,让被测代码不触达真实接口。

区分场景:纯单元测试 vs Spring 集成测试

两类测试对“mock外部接口”的处理方式不同,选错会导致注入失败或上下文启动慢:

  • 纯 Service 层单元测试(推荐首选):不加载 Spring 容器,用 @Mock + @InjectMocks。适合验证业务逻辑,速度快、隔离强。
  • 需 Spring 环境的测试(如 Controller 或含 @Autowired 的复杂 Service):用 @MockBean,它会替换 Spring 容器中同类型的 Bean,适用于 @SpringBootTest 场景。

纯单元测试:用 @Mock 模拟接口(无 Spring 上下文)

适用于只测 Service 方法,且其依赖(如 Repository、FeignClient 接口)可被构造注入。

MimicPC
MimicPC

MimicPC是一款通过云端运行 Stable Diffusion、ComfyUI、Flux 等 AI 应用的创作平台。

下载
  • 在测试类上加 @ExtendWith(MockitoExtension.class),自动初始化所有 @Mock 和 @InjectMocks 字段;
  • 用 @Mock 声明你要 mock 的接口变量(如 OrderFeignService orderFeign);
  • 用 @InjectMocks 标注被测对象(如 OrderService orderService),Mockito 会把上面的 @Mock 实例自动设为它的字段;
  • 在测试方法里用 when(mockInterface.method(...)).thenReturn(...) 定义调用行为;
  • 避免使用 new OrderService(new MockOrderFeign()) 手动构造——破坏了自动注入,也难维护。

Spring 环境中 mock 外部接口(如 Dubbo、Feign、RestTemplate)

当接口由 Spring 管理(比如 @FeignClient 或 @DubboReference),必须用 @MockBean 替换容器中的实例:

  • 测试类需标注 @SpringBootTest(可加 classes = {...} 缩小上下文);
  • 声明 @MockBean private RewardFeignClient rewardFeign; —— Spring 启动时会把它注册为单例 Bean,并覆盖原有实现;
  • 直接写 when(rewardFeign.grant(...)).thenReturn(true) 即可,无需额外初始化;
  • 注意:@MockBean 不能和 @Mock 混用在同一字段,否则可能因 Bean 冲突导致 NPE 或行为不可预期。

Stubbing 技巧:让 mock 行为更贴近真实

外部接口常返回复杂对象、抛异常或依赖参数,简单 thenReturn 不够用:

  • 按参数返回不同结果:when(userRepo.findById(eq(1L))).thenReturn(u1); when(userRepo.findById(eq(2L))).thenReturn(u2);
  • 模拟异常:when(paymentService.pay(any())).thenThrow(new InsufficientBalanceException());
  • 动态计算返回值:when(calculator.add(anyInt(), anyInt())).thenAnswer(invocation -> invocation.getArgument(0, Integer.class) + invocation.getArgument(1, Integer.class));
  • 验证是否调用:verify(orderFeign, times(1)).cancelOrder(eq("ORD-123"));,确保流程走到了外部调用环节。

不复杂但容易忽略:mock 的前提是接口定义清晰、依赖可注入。如果外部接口是静态方法或 new 出来的硬编码实例,就无法直接 mock——得先重构为可注入依赖,再测试才可持续。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
软件测试常用工具
软件测试常用工具

软件测试常用工具有Selenium、JUnit、Appium、JMeter、LoadRunner、Postman、TestNG、LoadUI、SoapUI、Cucumber和Robot Framework等等。测试人员可以根据具体的测试需求和技术栈选择适合的工具,提高测试效率和准确性 。

2023.10.13

4550

8

java测试工具有哪些
java测试工具有哪些

java测试工具有JUnit、TestNG、Mockito、Selenium、Apache JMeter和Cucumber。php还给大家带来了java有关的教程,欢迎大家前来学习阅读,希望对大家能有所帮助。

2023.10.23

2961

10

Java 单元测试
Java 单元测试

本专题聚焦 Java 在软件测试与持续集成流程中的实战应用,系统讲解 JUnit 单元测试框架、Mock 数据、集成测试、代码覆盖率分析、Maven 测试配置、CI/CD 流水线搭建(Jenkins、GitHub Actions)等关键内容。通过实战案例(如企业级项目自动化测试、持续交付流程搭建),帮助学习者掌握 Java 项目质量保障与自动化交付的完整体系。

2025.10.24

1066

26

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

2026.10.16

0

15

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

2026.10.16

0

15

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

2026.10.16

0

15

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

2026.10.15

0

20

MySQL 忘记密码怎么办
MySQL 忘记密码怎么办

MySQL忘记密码专题汇集不同版本与系统下的root密码重置方法,覆盖MySQL 5.7、8.0、Mac、Linux及本地集成环境,并提示恢复权限与重新登录的检查步骤。

2026.10.15

0

18

Vue.js 中 ref 和 reactive 的区别
Vue.js 中 ref 和 reactive 的区别

Vue.js中ref和reactive的区别专题汇集两种响应式API的定义、访问方式、对象解构、侦听与性能取舍等文章,帮助结合实际状态类型选择合适写法。

2026.10.15

0

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
文心快码功能介绍
文心快码功能介绍

共0课时 | 0人学习

文心快码Agent使用手册
文心快码Agent使用手册

共0课时 | 0人学习

Fitten Code官方手册
Fitten Code官方手册

共0课时 | 0人学习