Java Mockito 怎么用
程序员在写代码时,常会遇到这种情况:要调用一个数据库查询接口,但测试时不想真的连数据库;要调用一个第三方支付接口,但测试时不想每次都触发真实扣款。这时候,Java里的Mockito工具就能帮上大忙,它就像一个“替身演员”,能模拟出接口的返回结果,让测试不用依赖真实的外部服务,高效又灵活。
先搞懂Mockito的核心作用
举个生活化的例子:你要做一份番茄炒蛋,需要用到酱油,但测试厨艺时,你不想真的用昂贵的进口酱油,而是用味道接近的生抽代替,这样既能尝出自己炒的味道,又能避免浪费。Mockito就是这个“生抽”——它可以模拟任何接口、类甚至方法的行为,比如告诉它“模拟数据库查询的方法,当传参数是‘张三’时,就返回用户信息”,这样测试你的番茄炒蛋(业务代码)时,就不用依赖真实的进口酱油(真实数据库)了。

简单说,Mockito的核心是“造替身、定规则、拿结果”三个步骤,下面一步步拆解怎么用。
第一步:引入Mockito依赖
要使用Mockito,先给项目加个小工具包。如果是Maven项目,就在pom.xml里加一段配置,就像给自行车装上辅助轮,不用自己做工具:
`xml
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
`
加完后,就可以在测试代码里导入Mockito的方法了,就像准备好要用的生抽瓶子。
第二步:造“替身”对象
假设你有个用户服务类UserService,里面有个查询用户的方法getUserById,现在要测试另一个依赖它的业务类,就需要先给UserService造个替身。
用Mockito的mock方法就能做到:
`java
// 造UserService的替身
UserService mockUserService = Mockito.mock(UserService.class);
`
就像找个和真酱油外观、大小都一样的生抽瓶子,虽然不是真酱油,但能满足炒菜的基本需求。
第三步:给替身定“行为规则”
替身不能瞎干活,得告诉它遇到什么参数该返回什么结果,这就是“定规则”。比如规定:当调用getUserById方法,传参数是101时,返回一个用户对象。
用Mockito的when方法来写规则:
`java
// 定规则:参数为101时,返回指定用户
Mockito.when(mockUserService.getUserById(101)).thenReturn(new User(101, "小明"));
`
如果传参数是别的数字,替身会返回空,这就像生抽只有特定味道,不会出别的效果。
第四步:用替身做测试
规则定好后,就可以用这个替身来测试你的业务代码了。比如测试一个“获取用户姓名”的方法:
`java
// 用替身代替真实的UserService
UserManager userManager = new UserManager(mockUserService);
// 调用要测试的方法
String userName = userManager.getUserNameById(101);
// 验证结果是否符合预期,这里应该返回“小明”
assertEquals("小明", userName);
`
这样测试时,根本不用连真实的数据库,只要替身按规则返回结果,就能快速验证业务代码的逻辑对不对。
常见的小技巧
除了定返回结果,Mockito还有些实用的小操作:比如可以让替身抛出异常,模拟接口出错的情况;可以验证某个方法有没有被调用,确保业务逻辑正确触发了对应接口。比如想确认“获取用户”的方法确实被调用了:
`java
// 验证getUserById方法被调用过一次,参数是101
Mockito.verify(mockUserService, Mockito.times(1)).getUserById(101);
`
总的来说,Mockito就像程序员测试时的“替身演员”,不用依赖真实的外部服务,就能快速、准确地验证业务代码的逻辑,是Java开发里做单元测试的好帮手。