Mockito编写单元测试
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
代码说明:此部分代码均为在分享过程中编写的代码,其中士兵、武器、子弹类为测试 对象,其余为测试类
上一篇: css左右居中对齐