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