接上篇:https://developer.aliyun.com/article/1227519?spm=a2c6h.13148508.setting.17.5c8b4f0eXuUrKv
六、 模拟依赖方法
在模拟完依赖的参数和返回值后,就可以利用Mockito和PowerMock的功能,进行依赖方法的模拟。如果依赖对象还有方法调用,还需要模拟这些依赖对象的方法。
1. 根据返回模拟方法
1) 模拟无返回值方法
2) 模拟方法单个返回值
3) 模拟方法多个返回值
直接列举出多个返回值:
转化列表为多个返回值:
4) 模拟方法定制返回值
可利用Answer定制方法返回值:
5) 模拟方法抛出单个异常
指定单个异常类型:
指定单个异常对象:
6) 模拟方法抛出多个异常
指定多个异常类型:
指定多个异常对象:
7) 直接调用真实方法
2. 根据参数模拟方法
Mockito提供do-when语句和when-then语句模拟方法。
1) 模拟无参数方法
对于无参数的方法模拟:
2) 模拟指定参数方法
对于指定参数的方法模拟:
3) 模拟任意参数方法
在编写单元测试用例时,有时候并不关心传入参数的具体值,可以使用Mockito参数匹配器的any方法。Mockito提供了anyInt、anyLong、anyString、anyList、anySet、anyMap、any(Class clazz)等方法来表示任意值。
4) 模拟可空参数方法
Mockito参数匹配器的any具体方法,并不能够匹配null对象。而Mockito提供一个nullable方法,可以匹配包含null对象的任意对象。此外,Mockito.any()方法也可以用来匹配可空参数。
5) 模拟必空参数方法
同样,如果要匹配null对象,可以使用isNull方法,或使用eq(null)。
6) 模拟不同参数方法
Mockito支持按不同的参数分别模拟同一方法。
注意:
如果一个参数满足多个模拟方法条件,会以最后一个模拟方法为准。
7) 模拟可变参数方法
对于一些变长度参数方法,可以按实际参数个数进行模拟:
也可以用Mockito.any()模拟一个通用匹配方法:
注意:
Mockito.any()并不等于Mockito.any(Class type),前者可以匹配null和类型T的可变参数,后者只能匹配T必填参数。
3. 模拟其它特殊方法
1) 模拟final方法
PowerMock提供对final方法的模拟,方法跟模拟普通方法一样。但是,需要把对应的模拟类添加到@PrepareForTest注解中。
2) 模拟私有方法
PowerMock提供提对私有方法的模拟,但是需要把私有方法所在的类放在@PrepareForTest注解中。
3) 模拟构造方法
PowerMock提供PowerMockito.whenNew方法来模拟构造方法,但是需要把使用构造方法的类放在@PrepareForTest注解中。
4) 模拟静态方法
PowerMock提供PowerMockito.mockStatic和PowerMockito.spy来模拟静态方法类,然后就可以模拟静态方法了。同样,需要把对应的模拟类添加到@PrepareForTest注解中。
注意:
第一种方式不适用于PowerMockito.spy模拟的静态方法类。
接下篇:https://developer.aliyun.com/article/1227516?groupCode=java





















