Mockito详解
简述
Mockito为测试创建test double,即测试替身。
我们进行测试的时候,很多情况下我们测试的区域会依赖很多外部库,这时就需要测试替身,模拟外部库的返回值,让我们专注于我们要测试的内容。
常用注解和用法
@ExtendWith(MockitoExtension.class)
使用 @ExtendWith(MockitoExtension.class)开启对Mockito的支持
@Mock
@Mock注解标注在我们想要创建测试替身的成员变量上,本质上会创建一个子类,所有方法返回值为null
@InjectMocks
@InjectMocks注解会帮我们把该成员构造好,使用的是@Mock注解生成的测试替身类
Mockito.when()
Mockito.when()方法会指定测试替身具体方法的返回值,达到模拟外部依赖返回值的作用
Mockito.verify()
Mockito.verify()检查参数里的类的方法是否被调用
实例
例如这里我们想测试的是UserService,我们想创建的测试替身是UserRepository
我们使用@Mock注解创建了一个UserRepository的替身,该对象的所有方法都会返回默认值
我们使用Mockito.when()方法,指定userRepository.findOneById(id)的返回值是Optional.ofNullable(buildUser()),这个操作被称为stub,打桩
使用Mockito.verify(),检查userRepository的findOneById(id)是否被调用
@ExtendWith(MockitoExtension.class) class UserServiceTest { //本质上就是帮我们new了一个UserRepository子类注入进来,里面的所有方法返回值都是默认值 @Mock private UserRepository userRepository; //会自动检索@Mock标注的类,作为参数传入构造方法 @InjectMocks private UserService userService; @Test void testing_with_mockito_injection() { final var id = 123L; when(userRepository.findOneById(id)).thenReturn(Optional.ofNullable(buildUser())); User user = userService.findById(id); assertThat(user.getId()).isEqualTo(id); Mockito.verify(userRepository).findOneById(id); } User buildUser() { return User.builder() .id(123L) .name("Panda") .age(24L) .avatar("http://...") .description("A good guy.") .build(); } }
参数匹配器
在打桩的时候,如果该打桩方法有参数,真实运行的时候会比较现在打桩的参数和执行的时候的参数是否一致,一致才提供打桩方法实现
在verify的时候,如果该方法有参数,mockito会比较我们真实传的参数和现在测试提供的参数是否一致
这里的一致是指相等,对于普通类型来说就是值相等,对于对象来说就是用equal进行比较,没有实现的话比较的就是地址
对于打桩,想模拟给定类型的任何参数的行为,我们就能使用ArgumentMatchers类提供的一些静态方法
使用ArgumentMatchers指定打桩需要的参数条件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!