赞
踩
Java单元测试实践-00.目录(9万多字文档+700多测试示例)
https://blog.csdn.net/a82514921/article/details/107969340
对Spring的@Component组件的方法进行Stub、Replace、Suppress时,与对Mock/Spy对象进行Stub相比,区别在于前者的作用范围是指定类的全部实例;后者的作用范围是指定的Mock/Spy对象。
使用PowerMockito.stub()方法支持对Spring的@Component组件方法进行Stub。可参考前文对静态方法的处理。
使用PowerMockito.stub()对方法进行Stub时,作用范围是指定类的全部实例。
当间接调用被Stub方法时,Stub也生效。可参考示例TestSpStubPuNV3类test1方法。
使用PowerMockito.stub()方法对Spring的@Component组件方法进行Stub,需要使用@PrepareForTest注解指定Spring的@Component组件的实现类。
当不使用@PrepareForTest注解指定Spring的@Component组件实现类时,Stub不生效。可参考示例TestSpStubPuNV1类。
当使用@PrepareForTest注解指定Spring的@Component组件接口时,Stub不生效。可参考示例TestSpStubPuNV2类。
使用PowerMockito.stub()方法对Spring的@Component组件方法进行处理时,支持使用toReturn()与toThrow()方法。可参考示例TestSpStubPuNV3类test1、test2方法。
使用Stubber.stubMethod()方法支持对Spring的@Component组件方法进行Stub,使其返回指定值。支持传入Method对象,或Spring的@Component组件实现类Class对象与方法名。可参考示例TestSpStubPuNV3类test4、test5方法。
PowerMockito.stub()方法支持对Spring的@Component组件的公有非void方法、公有void方法、私有非void方法、私有void方法进行Stub( void方法支持使用toThrow()处理 )。
公有非void方法的示例已在前文说明。公有void方法、私有非void方法、私有void方法可参考示例TestSpStubPuV1、TestSpStubPrNV1、TestSpStubPrV1。
使用PowerMockito.replace()方法支持对Spring的@Component组件方法进行Replace。可参考前文对静态方法的处理。
使用PowerMockito.replace()对方法进行Replace时,作用范围是指定类的全部实例。
当间接调用被Replace方法时,Replace也生效。可参考示例TestSpReplacePuNV1类。
使用PowerMockito.stub()方法对Spring的@Component组件方法进行Replace,需要使用@PrepareForTest注解指定Spring的@Component组件的实现类。
使用MethodProxy.proxy()方法支持对Spring的@Component组件方法进行Replace。支持传入Method对象,或Spring的@Component组件实现类Class对象与方法名。可参考示例TestSpReplacePuNV2类。
PowerMockito.replace().with()方法只支持静态方法,不支持Spring的@Component组件的非静态方法。 可参考示例TestSpReplacePuNV3类。
PowerMockito.replace()方法支持对Spring的@Component组件的公有非void方法、公有void方法、私有非void方法、私有void方法进行Replace。
公有非void方法的示例已在前文说明。公有void方法、私有非void方法、私有void方法可参考示例TestSpReplacePuV1、TestSpReplacePrNV1、TestSpReplacePrV1。
使用PowerMockito.suppress()方法支持对Spring的@Component组件的字段或方法进行Suppress。
使用PowerMockito.suppress()对字段进行Suppress时,作用范围是指定类的全部实例。
当间接调用使用了被Suppress字段的方法时,Suppress也生效。可参考示例TestSpSuppressField1类test2方法。
使用PowerMockito.suppress()方法对字段进行Suppress,需要使用@PrepareForTest注解指定Spring的@Component组件的实现类。
PowerMockito.suppress()方法支持对公有、受保护、私有的字段进行Suppress。
当字段被Suppress后,在对应的类的方法中获取字段值,为null、0、false等值。可参考示例TestSpSuppressField1类test1方法。
通过反射获取被Suppress的字段,字段值仍为原始值,未被改变。可参考示例TestSpSuppressField1类test1方法。
使用SuppressCode.suppressField()可以对字段进行Suppress,可以传入Field对象。可参考示例TestSpSuppressField2类。
SuppressCode类的suppressField()方法除了支持传入Field类型的参数外,还支持传入“Class<?>[] classes”或“Class<?> clazz, String… fieldNames”参数,PowerMockito存在功能类似的方法,在此不进行说明。
使用PowerMockito.suppress()对方法进行Suppress时,作用范围是指定类的全部实例。
当间接调用被Suppress方法时,Suppress也生效。可参考示例TestSpSuppressPuNVMethod2类。
使用PowerMockito.suppress()对方法进行Suppress,需要使用@PrepareForTest注解指定Spring的@Component组件的实现类。
当方法被Suppress后,返回值为null、0、false等值,可参考前文对静态方法的处理。可参考示例TestSpSuppressPuNVMethod2类。
使用SuppressCode.suppressMethod()可以对方法进行Suppress,可以传入Method对象。可参考示例TestSpSuppressPuNVMethod3类。
SuppressCode类还提供了其他方法,支持对方法进行Suppress,如suppressConstructor()、suppressSpecificConstructor(),以及参数不同的suppressMethod()方法,PowerMockito存在功能类似的方法,在此不进行说明。
使用PowerMockito.methodsDeclaredIn()方法可以获取指定类的全部方法( 不含构造函数 ),再使用PowerMockito类的suppress(Method[] methods)方法,可以对获取的全部方法进行Suppress。可参考示例TestSpSuppressMethods1类。
使用PowerMockito.everythingDeclaredIn()方法可以获取指定类的全部方法( 包含构造函数 ),再使用PowerMockito类的suppress(Method[] methods)方法,可以对获取的全部方法进行Suppress。可参考示例TestSpSuppressEverything1类。
PowerMockito.suppress()方法支持对Spring的@Component组件的公有非void方法、公有void方法、私有非void方法、私有void方法进行Suppress。
公有非void方法的示例已在前文说明。公有void方法、私有非void方法、私有void方法可参考示例TestSpSuppressPuVMethod1、TestSpSuppressPrNVMethod1、TestSpSuppressPrVMethod1类。
对同一个方法执行Mock/Spy后Stub、Stub、Replace、Suppress等操作时,生效的情况比较复杂,应避免对同一个方法执行不同的操作。
当PowerMockito.stub().toReturn()对同一个方法执行多次时,最后一次执行的操作生效。可参考TestSpEffectiveStubToReturn1类。
当PowerMockito.stub().toThrow()对同一个方法执行多次时,最后一次执行的操作生效。可参考TestSpEffectiveStubToThrow1类。
当PowerMockito.stub().toReturn()与PowerMockito.stub().toThrow()对同一个方法执行时,PowerMockito.stub().toReturn()的操作生效。可参考示例TestStEffectiveStubThrRe1类。
当PowerMockito.replace().with()对同一个方法执行多次时,最后一次执行的操作生效。可参考TestSpEffectiveReplace1类。
当PowerMockito.stub().toReturn()、PowerMockito.stub().toThrow()与PowerMockito.replace().with()对同一个方法执行时,PowerMockito.stub().toReturn()的操作生效。可参考示例TestSpEffectiveStRe1类。
当PowerMockito.stub().toThrow()与PowerMockito.replace().with()对同一个方法执行时,后执行的操作生效。可参考示例TestSpEffectiveStThrRe1类。
当PowerMockito.stub().toReturn()、PowerMockito.stub().toThrow()、PowerMockito.replace().with()与PowerMockito.suppress()对同一个方法执行时,PowerMockito.suppress()的操作生效。可参考示例TestSpEffectiveStReSu1类。
PowerMockito类的stub()、replace()、suppress()方法,都无法对Spring的@Component组件实现类的Mock对象或Spy对象产生影响。只有Mockito.when()/Mockito.do…().when()方法对Spring的@Component组件实现类的Mock对象或Spy对象的Stub生效。
可参考示例TestSpEffectiveMockStRet1、TestSpEffectiveMockStRet2Spy类。
可参考示例TestSpEffectiveMockStThr1、TestSpEffectiveMockStThr2Spy类。
可参考示例TestSpEffectiveMockRe1、TestSpEffectiveMockRe2Spy类。
可参考示例TestSpEffectiveMockStRe1、TestSpEffectiveMockStRe2Spy类。
可参考示例TestSpEffectiveMockSu1、TestSpEffectiveMockSu2Spy类。
可参考示例TestSpEffectiveMockStReSu1、TestSpEffectiveMockStReSu2Spy类。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。