欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mockito编写单元测试

程序员文章站 2022-04-26 16:01:52
...

Mock是常用的单元测试工具之一,Mockito是Mock工具的一种,能解决现实应用中,绝大部分的场景应用。。

Mockito简单应用的环境准备

使用的项目为Maven Project,使用的测试工具为TestNg,过程中全部使用Mock注解方式。

<!-- Mockito -->
<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-all</artifactId>
  <version>1.9.5</version>
</dependency>
<!– TestNg -->
<dependency>
  <groupId>org.testng</groupId>
  <artifactId>testng</artifactId>
  <version>6.8.13</version>
</dependency>

@Mock与@Spy

  • @Mock对象:对象生成时不会执行任何构造器方法,方法调用时,不执行方法中的任何内容,返回原始默认值。
  • @Spy对象:对象生成时执行构造器方法,方法调用时,执行方法中的任何内容。

重要:使用Mock注解时,对象初始化之前,一定要先执行 MockitoAnnotations.initMocks(this); 方法,使用TestNg时,可以放到@BeforeClass中
提示:Spy对象本质上是Mock对象,它实际上是Mock对象的一种特殊形式

@InjectMocks

@InjectMocks对象:对象生成时会执行构造器方法,如果有多个构造器,则会选择参数最多的构造方法,对象中的属性和属性的Setter方法会被Mock对象(包括@Spy)注入,方法调用时,执行方法中的任何内容。

提示:当InjectMocks对象既有属性又有属性的Setter方法时,这个Setter方法会被执行两次,换句话说,对于属性的注入,其实也是在调用set方法。

Stub(桩)

Stub(桩)表达的一种当假设的情况发生时要做什么的情况设置。
Stub的表达式有两种,一种是when…then…,另一种是do…when…,两种所表达的意思是一样的,然而也有不同之处:
1、使用when…then…的时候,spy对象的方法会被执行一次,而使用do…when…则不会
2、部分do…when…能适用void方法,而when…then…则没有

提示:Mock对象被打桩后就不会再执行了
提示:Injectmocks对象不能被打桩
提示:推荐使用do…when…方式

Stub(桩)-具有返回值的方法

when…thenReturn…
doReturn…when…

Stub(桩)-void方法

Stub针对void方法只有3个选择:执行方法、什么都不做、抛异常
doCallRealMethod…when…
doNothing…when…
doThow…when…

提示:这几个同样适用于具有返回值的方法

验证

验证 verfiy,用于验证Mock对象的执行情况
verify(mock).method()
verify(mock, times(1)).method()
verify(mock, atLeastOnce()).method()
verify(mock, atLeast(1)).method()
verify(mock, atMost(1)).method()
verify(mock, never()).method()

提示:verify(mock).method()等同于verify(mock, times(1)).method()
提示:InjectMocks对象不能被验证

获取参数

对于一些含有参数的void方法,如果参数是个引用对象,并且在void方法中进行了修改,出于某种目的,我们需要获得这个经过修改的参数对象,该怎么办呢?
Mockito提供了ArgumentCaptor类用于进行参数获取。

演示代码

Soldier.java
Weapon.java
Bullet.java
BaseTester.java
TestMockAndSpy.java
TestInjectMocks.java
TestStubForReturnMethod.java
TestVerify.java
TestArgumentCaptor.java

代码说明:此部分代码均为在分享过程中编写的代码,其中士兵、武器、子弹类为测试 对象,其余为测试类