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

news/2024/7/8 12:28:10

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


http://www.niftyadmin.cn/n/4057559.html

相关文章

俺是一个三俗的程序员

俺很三俗&#xff0c;想起来一定尽量回复过来。 想起来一个&#xff0c;就是在水园天天有人发大道理&#xff0c;俺每次看见心里骂&#xff0c;废话一堆。 看见有人忽悠新技术&#xff0c;心里骂&#xff0c;不就是技术垄断吗&#xff1f; 收到垃圾邮件&#xff0c;让信X的&…

Java单元测试实践-16.Spring AOP与Mock

Java单元测试实践-00.目录&#xff08;9万多字文档700多测试示例&#xff09; https://blog.csdn.net/a82514921/article/details/107969340 1. Spring AOP与Mock 以下示例使用CGLIB代理&#xff0c;或JDK动态代理&#xff0c;执行结果相同。 以下使用注解的方式设置AOP&…

Java单元测试实践-17.Mybatis与Mock

Java单元测试实践-00.目录&#xff08;9万多字文档700多测试示例&#xff09; https://blog.csdn.net/a82514921/article/details/107969340 1. Mybatis与Mock 在对Mybatis的Mapper对象进行处理时&#xff0c;可能需要使某个Mapper对象在某些情况下返回指定值&#xff0c;在某…

Java单元测试实践-18.使用注解进行Stub、Replace、Suppress

Java单元测试实践-00.目录&#xff08;9万多字文档700多测试示例&#xff09; https://blog.csdn.net/a82514921/article/details/107969340 1. 使用MockPolicy注解进行Stub、Replace、Suppress MockPolicy注解的说明可参考 https://javadoc.io/doc/org.powermock/powermock-…

俺是郭德纲先生的忠实非现场 听众+观众

俺从小喜欢听相声&#xff0c;在郭先生火爆之前就常年到处下载&#xff0c;曾经将某网站所有的相声都下载下来过。在俺看来&#xff0c;郭德纲先生的相声说的非常好&#xff0c;能够将俺逗乐&#xff0c;这说明郭德纲先生干一行爱一行、说相声首先就是搞笑的。 在郭先生被jb台陷…

回了一趟老家

周末回了一趟老家&#xff0c;又节能减排限电了&#xff0c;家里有两个鸵鸟蛋&#xff0c;可惜忘了照照片了&#xff0c;也忘了带过来了&#xff0c;家里养的几盆菊花开的很盛。 听说家里买了几根竹杆&#xff0c;到地里锯了几个竹根过来&#xff0c;不是很好&#xff0c;但是经…

Java单元测试实践-19.Mockito与PowerMock的其他功能

Java单元测试实践-00.目录&#xff08;9万多字文档700多测试示例&#xff09; https://blog.csdn.net/a82514921/article/details/107969340 1. Mockito与PowerMock的其他功能 1.1. 获取Mock对象详细信息 Mockito提供了用于获取Mock对象详细信息的API&#xff0c;可参考 htt…