小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
单元测试
什么是单元测试
在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。
引用自维基百科
为什么需要单元测试
- 提高分支覆盖,尽量避免由于代码改动出现bug
- 利于重构
- 提高代码质量
- 修改代码反馈速度很快,不改单元测试就会出错
你是否很烦这些单元测试
来带你看看单元测试利器-Mock
Mock
什么是Mock单元测试
Mock是动态模拟对象生成器,减轻了用户手动生成模拟对象的麻烦,非常适合服务进行依赖的单元测试
使用
引入项目
maven项目通过以下代码即可引入
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.8.47</version>
</dependency>
Gradle项目可以通过以下引入
org.mockito:mockito-core:2.8.47
示例
将你需要的service注入到单元测试类里可以通过以下的代码来模拟对象
@Mock
private TestService testService;
设定预期返回值
when(testService.getById(1L)).thenReturn(test);
不知道getById方法入参的情况下,可以通过any()模拟所有参数入参都可以接收。注意:多个参数时,需要都使用any(),不能一个使用any(),一个使用具体参数。会导致编译报错(坑点)
// 正例
when(testService.getBy(any(), any())).thenReturn(test);
// 反例
when(testService.getBy(any(), 1L)).thenReturn(test);
没有返回值的方法可以通过verify**()方法进行验证
verify(testService).update(any());
如果想测试throw里的分支可以通过异常捕捉即可
@Rule
public ExpectedException expectedEx = ExpectedException.none();
// 预期会抛出RuntimeException异常
expectedEx.expect(RuntimeException.class);
expectedEx.expectMessage("数据库连接失败");
// 调用getById抛出RuntimeException异常
when(testService.getById(1L)).thenThrow(new RuntimeException("数据库连接失败"));
当一切都模拟好了如何调用你想测试的方法
@InjectMocks
private TestManager testManager;
testManager.testMock();
// 注意:verify的方法需要在testMock()后面使用
verify(testService).update(any());
结语
今天讲了mock的基本使用,单元测试在日常的开发中还是很有必要写上的,可以体现出程序的稳定性,后续还会讲到快照和一些其他的知识。
有了Mock相信可以更快的写出单元测试了。