Java单元测试实践-15.Stub、Replace、Suppress Spring的方法

  • Post author:
  • Post category:java


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类。



版权声明:本文为a82514921原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。