即使不懂单元测试,会用这个工具也够了~
时间:2022-07-25
本文章向大家介绍即使不懂单元测试,会用这个工具也够了~,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Mockito 是一个强大的用于 Java 开发的模拟测试框架, 通过 Mockito 我们可以创建和配置 Mock 对象, 进而简化有外部依赖的类的测试.可以不进行外部依赖,快速进行Java的单元测试的进行。
Mock 模拟
mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。
Mockito好处
无手写 : 无需自己编写模拟对象。
重构安全 : 重命名接口方法名称或重新排序参数不会破坏测试代码,因为Mocks是在运行时创建的。
- 返回值支持 : 支持返回值
- 异常支持 : 支持例外
- 订单检查支持 : 支持检查方法调用的顺序
- 注释支持 : 支持使用注释创建模拟
Mockito集成
引入依赖
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.3.3</version>
<scope>test</scope>
</dependency>
Mockito的使用
初始化
@Before
public void initMocks() {
MockitoAnnotations.initMocks(this);
}
或者:
//引入依赖
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {
}
注解
@Mock
用于模拟对象,有助于减少重复模拟对象。
注意:@Mock注释始终与@RunWith注释一起使用。
@RunWith
这是一个类级别的注释。它用于保持测试干净并改善调试。它还会检测测试中可用的未使用的存根, 并使用@Mock注释对模拟进行初始化。
@InjectMocks
它标记应在其上执行注入的字段或参数。
@Captor
它允许创建字段级参数捕获器。它与Mockito的verify()方法一起使用, 以获取调用方法时传递的值。
@Spy
允许创建部分模拟的对象。换句话说, 它允许将现场实例快速包装在测试对象中。
创建一个实例
package com.example.sl.demospringboot;
import com.example.sl.demospringboot.dao.UserMapper;
import com.example.sl.demospringboot.model.User;
import com.example.sl.demospringboot.service.UserService;
import com.example.sl.demospringboot.service.UserServiceImpl;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.*;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.List;
import java.util.Map;
import static org.mockito.Mockito.*;
//引入依赖
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {
//初始化Mokc注解对象或者@RunWith(MockitoJUnitRunner.class)
// @Before
// public void initMocks() {
// MockitoAnnotations.initMocks(this);
// }
//模拟一个对象
@Mock
private Map map;
@InjectMocks
private UserServiceImpl userServicei;
@Mock
private UserService userService;
@Mock
private UserMapper userMapper;
@Test
public void test1(){
User user=mock(User.class);
when(user.getUsername()).thenReturn("快乐");
//当调用user.getUsername()返回“快乐”
Assert.assertEquals("快乐",user.getUsername());
Assert.assertTrue(map instanceof Map);
//当调用user.getUsername()抛空指针
Mockito.doThrow(new NullPointerException()).when(user.getUsername());
//当调用user的时候什么事情也不用做
Mockito.doNothing().when(user);
map.size();
//verify检测方法调用,这表明size方法调用一次
verify(map,times(1)).size();
}
/**
* 捕获参数
*/
@Test
public void testGetParam(){
String param="我是一个参数";
//模拟一个List对象
List listO=Mockito.mock(List.class);
ArgumentCaptor<String> paramObject = ArgumentCaptor.forClass(String.class);//捕获参数的对象
listO.add(param);//mock对象执行add方法,将test添加进其中
verify(listO).add(paramObject.capture());//捕获参数
Assert.assertEquals("我是一个参数", paramObject.getValue());//断言验证
}
/**
* 模拟数据库查询一个User
*/
@Test
public void testGetUser(){
User user=new User();
user.setAge(1);
//调用方法返回一个实体
when(userServicei.findUser()).thenReturn(user);
// System.out.println("userService.findUser().getAge() = " + userServicei.findUser().getAge());
Assert.assertEquals("1",userServicei.findUser().getAge()+"");
verify(userMapper).getUser();
}
/**
* 调用接口发方法进行测试
* 设置超时时间
*/
@Test(timeout = 1000)
public void testInterface() throws InterruptedException {
User user=new User();
user.setUsername("test");
//调用userService.findUser()返回一个usaer
when(userService.findUser()).thenReturn(user);
Assert.assertEquals("test",userService.findUser().getUsername());
//验证执行几次
verify(userService).findUser();
}
}
注意
@InjectMocks 创建一个实例,也就是一个包含注入接口或者其他bean的一个对象。
@Mock 是一个实例里面的一个注入对象,对应的是spring的一个bean。
- TensorFlow 入门
- Python 爬虫 1 快速入门
- Exim Off-by-one(CVE-2018-6789)漏洞复现分析
- 一文学会用 Tensorflow 搭建神经网络
- 数据降维处理:PCA之特征值分解法例子解析
- 理解Eureka的自我保护模式
- 如何使用Feign构造多参数的请求
- 最简日志打印规范
- 碎片化 | 第四阶段-47-值栈细节问题-视频
- word2vec 模型思想和代码实现
- 碎片化 | 第四阶段-48-hibernate概述和配置-视频
- 【LEETCODE】模拟面试-357- Count Numbers with Unique Digits
- Python 爬虫 2 爬取多页网页
- 碎片化 | 第四阶段-49-hibernate之HQL查询操作-视频
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法