前言
本篇文章将说明如何使用
PowerMock
对公共方法进行
Spy
。关于使用
PowerMock
需要引入哪些依赖,请参考PowerMock使用-依赖准备。
正文
先给出一个示例,再对
Spy
进行解释。被测试类如下所示。
publicclassSpyPublicMethod{publicbooleanisTrue1(){returntrue;}publicbooleanisTrue2(){returntrue;}}
测试类如下所示。
publicclassPowerMockTest{@TestpublicvoidspyPublic(){SpyPublicMethod spy =PowerMockito.spy(newSpyPublicMethod());PowerMockito.doReturn(false).when(spy).isTrue1();assertThat(spy.isTrue1(),is(false));assertThat(spy.isTrue2(),is(true));}}
Spy
公共方法时需要使用
PowerMockito.spy(方法所在类的实例)
获取
Spy
出来的对象,这里称之为spy实例,不对spy实例进行任何操作的情况下,spy实例与真实实例是完全一样的。同时由于spy实例与真实实例完全一样,因此在对spy实例进行打桩时使用
doReturn()
和
thenReturn()
是存在差别的:使用
doReturn(返回值)
时不会执行真实方式,直接返回返回值;使用
thenReturn(返回值)
时会先执行一遍真实方法,然后返回返回值。通常情况下
Spy
需要配合
doReturn()
使用,用于抑制真实方法的执行,防止执行真实方法时报错。
同时,打桩时使用
doReturn()
和
thenReturn()
的语法存在差别,上面例子中打桩时如果使用的语句为
PowerMockito.doReturn(false).when(spy.isTrue1())
,会导致编译时正常,运行时报错的现象。下表对打桩时
doReturn()
和
thenReturn()
的语法进行了对比。
使用场景doReturn()thenReturn()打桩
public
方法
PowerMockito.doReturn(false).when(spy).isTrue()
PowerMockito.when(spy.isTrue()).thenReturn(false)
打桩
private
方法
PowerMockito.doReturn(false).when(spy, "returnTrue")
PowerMockito.when(spy, "returnTrue").thenReturn(false)
打桩
static
方法
PowerMockito.doReturn(false).when(SpyStaticPublicMethod.class, "isTrue")
PowerMockito.when(SpyStaticPublicMethod.isTrue()).thenReturn(false)
打桩
static private
方法
PowerMockito.doReturn(false).when(SpyStaticPrivateMethod.class, "returnTrue")
PowerMockito.when(SpyStaticPrivateMethod.class, "returnTrue").thenReturn(false)
最后,
Spy
也和
Mock
一样,可以配合
whenNew()
进行使用。
版权归原作者 樱花祭的约定 所有, 如有侵权,请联系我们删除。