单元测试利器-Mock

1,104 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

单元测试

什么是单元测试

在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。

引用自维基百科

为什么需要单元测试

image.png

  • 提高分支覆盖,尽量避免由于代码改动出现bug
  • 利于重构
  • 提高代码质量
  • 修改代码反馈速度很快,不改单元测试就会出错

你是否很烦这些单元测试

tempImage1632478007659.jpg来带你看看单元测试利器-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相信可以更快的写出单元测试了。 tempImage1632478207900.gif