Java单元测试实践-08.Stub、Replace、Suppress静态方法
Java单元测试实践-00.目录(9万多字文档+700多测试示例)
https://blog.csdn.net/a82514921/article/details/107969340
1. Stub、Replace、Suppress静态方法
以下主要说明,如何使用PowerMockito对静态方法进行Stub、Replace,以及对静态方法所在的类进行Suppress。
1.1. 对静态方法进行Stub
使用PowerMockito.stub()方法支持对静态方法进行Stub。
当间接调用被Stub方法时,Stub也生效。 可参考示例TestStStubPuNVIndirect1类。
对静态方法进行Stub时,示意图所下:
1.1.1. 获得Method对象
PowerMockito.stub()方法的参数为Method对象,可以使用PowerMockito.method()获得需要进行Stub的方法的Method对象。
PowerMockito.method()方法支持两种设置方式:
- 指定静态方法所在的类、静态方法名
当类不存在多个同名方法时,调用PowerMockito.method()方法获得Method对象时,可以指定类的Class对象、静态方法名。可参考示例TestStStubPuNVPrepareClass1类test1方法。
- 指定静态方法所在的类、静态方法名、方法的参数类型
当类存在多个同名方法时,调用PowerMockito.method()方法获得Method对象时,需要指定类的Class对象、静态方法名,以及方法的参数类型。可参考示例TestStStubPuNVPrepareClass1类test2方法。
使用PowerMockito.stub()与PowerMockito.method()方法的示例如下:
PowerMockito.stub(PowerMockito.method(TestStaticPublicNonVoid1.class, TestStaticPublicNonVoid1.NAME_TEST1));PowerMockito.stub(PowerMockito.method(TestStaticPublicNonVoid1.class, TestStaticPublicNonVoid1.NAME_TEST1,String.class, TestTableEntity.class));
1.1.2. 使用@PrepareForTest注解
使用PowerMockito.stub()方法对静态方法进行Stub,需要使用@PrepareForTest注解指定被Stub的方法对应的类。
当不使用@PrepareForTest注解指定被Stub方法所在类时,Stub不生效。可参考示例TestStStubPuNVNoPrepare1类。
支持在类级别使用@PrepareForTest注解。可参考示例TestStStubPuNVPrepareClass1类。
支持在@Test方法级别使用@PrepareForTest注解。可参考示例TestStStubPuNVPrepareMethod1类。
1.1.3. toReturn()与toThrow()方法
PowerMockito.stub()方法返回类型为MethodStubStrategy,MethodStubStrategy接口在org.powermock.api.support.membermodification.strategy包中,提供toReturn()、toThrow()方法。
- toReturn()方法
在对方法进行Stub时,使用toReturn()方法可以使其返回指定的值,实现的功能与Mockito.when().thenReturn()类似,toReturn()方法的参数指定了返回值。使用示例如下,可参考示例TestStStubPuNVPrepareClass1类test1方法。
PowerMockito.stub(PowerMockito.method(TestStaticPublicNonVoid1.class, TestStaticPublicNonVoid1.NAME_TEST1)).toReturn(TestConstants.MOCKED);
- toThrow()方法
在对方法进行Stub时,使用toThrow()方法可以使其抛出指定的Throwable对象,实现的功能与Mockito.when().thenThrow()类似,toThrow()方法的参数指定了需要抛出的Throwable对象。使用示例如下,可参考示例TestStStubPuNVPrepareClass1类test2方法。
PowerMockito.stub(PowerMockito.method(TestStaticPublicNonVoid1.class, TestStaticPublicNonVoid1.NAME_TEST1,String.class, TestTableEntity.class)).toThrow(new RuntimeException(TestConstants.MOCKED));
PowerMockito.stub()方法可以在不包含@Test、@Before、@PrepareForTest注解的方法中执行。 可参考示例TestStStubPuNVRun1、TestStStubPuNVStub1类。
1.1.4. 使用Stubber.stubMethod()方法进行Stub
使用Stubber.stubMethod()方法支持对静态方法进行Stub,使其返回指定值,与PowerMockito.stub().toReturn()方法类似。
Stubber.stubMethod()方法在使用时支持以下两种方式:
- 指定需要Stub的静态方法的Method对象,及需要返回的值
使用示例如下,可参考示例TestStStubPuNVStubber1类。
Stubber.stubMethod(PowerMockito.method(TestStaticPublicNonVoid1.class, TestStaticPublicNonVoid1.NAME_TEST1),TestConstants.MOCKED);
- 指定需要Stub的静态方法所在类的Class对象,静态方法名,及需要返回的值
使用示例如下,可参考示例TestStStubPuNVStubber2类。
Stubber.stubMethod(TestStaticPublicNonVoid1.class, TestStaticPublicNonVoid1.NAME_TEST1, TestConstants.MOCKED);
1.1.5. PowerMockito.stub()方法与静态方法
PowerMockito.stub()方法支持对静态公有非void方法、公有void方法、私有非void方法、私有void方法进行Stub( void方法支持使用toThrow()处理 )。
静态公有非void方法的示例已在前文说明。静态公有void方法、私有非void方法、私有void方法可参考示例TestStStubPuV1、TestStStubPuV2、TestStStubPrNV1、TestStStubPrNV2、TestStStubPrV1、TestStStubPrV2。
1.2. 对静态方法进行Replace
使用PowerMockito.replace()方法支持对静态方法进行Replace。
当间接调用被Replace方法时,Replace也生效。 可参考示例TestStReplacePuNVIndirect1类。
1.2.1. 使用@PrepareForTest注解
使用PowerMockito.replace()方法对静态方法进行Replace,需要使用@PrepareForTest注解指定被Replace的方法对应的类。
当不使用@PrepareForTest注解指定被Replace方法所在类时,Replace不生效。可参考示例TestStReplacePuNVNoPrepare1类。
1.2.2. 使用InvocationHandler进行Replace处理
PowerMockito.replace()方法返回类型为MethodReplaceStrategy,MethodReplaceStrategy接口在org.powermock.api.support.membermodification.strategy包中,提供“void with(InvocationHandler invocationHandler);”与“void with(Method method);”方法。
InvocationHandler接口在java.lang.reflect包中,提供“public Object invoke(Object proxy, Method method, Object[] args)”方法。处理代理实例上的方法调用并返回结果。当调用代理实例的方法时,会调用关联的invocation handler的方法。
PowerMockito.replace().with(InvocationHandler)方法与Mockito.when().thenAnswer()方法功能类似,replace()需要传入Method参数,可以使用PowerMockito.method()方法获取,InvocationHandler接口的返回值将作为被Replace的方法的返回值,示例如下:
PowerMockito.replace(PowerMockito.method(TestStaticPublicNonVoid1.class, TestStaticPublicNonVoid1.NAME_TEST1)).with(new TestInvocationHandler1());
在InvocationHandler接口的invoke方法中的参数说明如下:
- proxy参数:被调用方法所在的代理实例;
- method参数:在代理实例上调用的接口方法相对应的Method实例;
- args参数:调用代理实例的方法时传递的参数值的对象数组;如果接口方法不带参数,则为null。基本类型的参数会使用对应的包装器类类型,例如java.lang.Integer或java.lang.Boolean。
例如对com.adrninistrator.static1.TestStaticPublicNonVoid1类的静态方法test1通过PowerMockito.replace().with(InvocationHandler)设置InvocationHandler进行处理,在InvocationHandler实现类中查看,proxy参数为“class com.adrninistrator.static1.TestStaticPublicNonVoid1”,method参数为“public static java.lang.String com.adrninistrator.static1.TestStaticPublicNonVoid1.test1(java.lang.String,com.adrninistrator.dao.entity.TestTableEntity)”,args参数为调用TestStaticPublicNonVoid1.test1()方法时指定的参数数组。
可参考示例TestStReplacePuNVShowArgs1类。
1.2.2.1. 使用lambda表达式进行Replace
InvocationHandler接口的实现类也可以使用匿名类,示例略。
InvocationHandler接口支持使用lambda表达式,示例如下:
PowerMockito.replace(PowerMockito.method(TestStaticPublicNonVoid1.class, TestStaticPublicNonVoid1.NAME_TEST1)).with((proxy, method, args) -> method.invoke(proxy, args));
可参考示例TestStReplacePuNVInvoke1类。
1.2.2.2. 通过method.invoke()执行真实方法
在InvocationHandler接口的实现类中,调用method.invoke(proxy, args)可以执行真实方法。
可参考示例TestStReplacePuNVInvoke1类。
1.2.2.3. 获取调用参数等信息
在InvocationHandler实现类的invoke方法中,可以根据请求参数决定修改返回值、抛出异常或执行真实方法。可参考示例TestStReplacePuNVModifyRsp1类。
1.2.2.4. 修改调用参数并执行真实方法
在InvocationHandler实现类的invoke方法中,可以修改调用参数并执行真实方法,但意义不大。可参考示例TestStReplacePuNVModifyArg1类。
1.2.2.5. 获取调用堆栈
在InvocationHandler实现类的invoke方法中,可以通过Thread.currentThread().getStackTrace()获取调用堆栈,判断当前Replace的方法被哪个方法调用。可参考示例TestStReplacePuNVStack1类。
1.2.2.6. 判断指定方法是否执行
在InvocationHandler实现类的invoke方法中,可以记录执行次数或标志,在测试代码中可以判断,被测试代码的指定方法在特定条件下的执行次数,或判断是否有执行过。可参考示例TestStReplacePuNVCalled1类。
1.2.2.6.1. 延长方法执行耗时
在InvocationHandler实现类的invoke方法中,可以通过sleep延长方法执行耗时。可参考示例TestStReplacePuNVSpendTime1类。
1.2.3. 替换静态方法
PowerMockito.replace().with()方法支持传入Method参数,可将Method参数对应的原始方法替换为目标方法,当被测试代码执行真实方法时,会执行被替换后的目标方法,不会执行真实方法。原始方法与目标方法都需要为静态方法。可以使用PowerMockito.method()方法获取Method对象。
如下示例,将TestStaticPublicNonVoid1.test1()方法替换为TestStReplacePuNVMethod1.replace_test1()方法,当调用TestStaticPublicNonVoid1.test1()方法时,实际会调用TestStReplacePuNVMethod1.replace_test1()方法。可参考示例TestStReplacePuNVMethod1类。
PowerMockito.replace(PowerMockito.method(TestStaticPublicNonVoid1.class, TestStaticPublicNonVoid1.NAME_TEST1)).with(PowerMockito.method(TestStReplacePuNVMethod1.class, "replace_test1"));
当间接调用被Replace方法时,Replace也生效。 可参考示例TestStReplacePuNVMethod2类。
1.2.4. 使用MethodProxy.proxy()方法进行Replace
使用MethodProxy.proxy()方法支持对静态方法进行Replace,在InvocationHandler中进行需要的处理,与PowerMockito.replace().with(InvocationHandler)方法类似。
MethodProxy.proxy()方法在使用时支持以下两种方式:
指定需要Stub的静态方法的Method对象,及InvocationHandler实现类,使用示例如下,可参考示例TestStStubPuNVStubber1类。
MethodProxy.proxy(PowerMockito.method(TestStaticPublicNonVoid1.class, TestStaticPublicNonVoid1.NAME_TEST1),new TestInvocationHandler1());
指定需要Stub的静态方法所在类的Class对象,静态方法名,及InvocationHandler实现类,使用示例如下,可参考示例TestStStubPuNVStubber2类。
MethodProxy.proxy(TestStaticPublicNonVoid1.class, TestStaticPublicNonVoid1.NAME_TEST1, newTestInvocationHandler1());
1.2.5. PowerMockito.replace()方法与静态方法
PowerMockito.replace()方法支持对静态公有非void方法、公有void方法、私有非void方法、私有void方法进行Replace。
静态公有非void方法的示例已在前文说明。静态公有void方法、私有非void方法、私有void方法可参考示例TestStReplacePuV1TestStReplacePuV4,TestStReplacePrNV1TestStReplacePrNV4,TestStReplacePrV1~TestStReplacePrV4。
1.3. 对静态方法所在的类进行Suppress
使用PowerMockito.suppress()方法支持对静态方法所在类的字段或静态方法进行Suppress。
1.3.1. 对字段进行Suppress
当间接调用使用了被Suppress字段的方法时,Suppress也生效。 可参考示例TestStSuppressFieldIndirect1类。
1.3.1.1. 使用@PrepareForTest注解
使用PowerMockito.suppress()方法对字段进行Suppress,需要使用@PrepareForTest注解指定被Suppress的方法对应的类。
当不使用@PrepareForTest注解指定被Suppress字段所在类时,Suppress不生效。可参考示例TestStSuppressPuNVMethodNoPrepare1类。
使用PowerMockito.suppress()方法对字段进行Suppress时,需要传入Field参数,可以使用PowerMockito.field()方法获取Field对象,如下所示:
PowerMockito.suppress(PowerMockito.field(TestStaticPublicNonVoid1.class, "flag"));
被Suppress的字段会被禁止,当有方法使用被Suppress的字段时,会获得null等值。 可参考示例TestStSuppressFieldWithPrepare1类。
1.3.1.2. 被Suppress字段的值
PowerMockito.suppress()方法支持对公有、受保护、私有的字段进行Suppress。
当字段被Suppress后,在对应的类的方法中获取字段值,为null、0、false等值,不同类型的字段及被Suppress后的值如下所示:
类型 | 被Suppress后的值 |
---|---|
String | null |
StringBuffer | null |
StringBuilder | null |
byte | 0 |
Byte | null |
char | ’ '( 空格 ) |
Character | null |
boolean | false |
Boolean | null |
short | 0 |
Short | null |
int | 0 |
Integer | null |
long | 0L |
Long | null |
float | 0F |
Float | null |
double | 0D |
Double | null |
BigDecimal | null |
自定义类 | null |
List | null |
Map | null |
可参考示例TestStSuppressFieldValue1类。
1.3.1.3. 获取字段实际值
通过反射获取被Suppress的字段,字段值仍为原始值,未被改变。可参考示例TestStSuppressFieldRaw1类。
1.3.1.4. 使用SuppressCode.suppressField()对字段进行Suppress
使用SuppressCode.suppressField()可以对字段进行Suppress,可以传入Field对象。使用示例如下,可参考示例TestStSuppressFieldSuppressCode1类。
SuppressCode.suppressField(PowerMockito.field(TestStaticPublicNonVoid1.class, "flag"));
SuppressCode类的suppressField()方法除了支持传入Field类型的参数外,还支持传入“Class<?>[] classes”或“Class<?> clazz, String… fieldNames”参数,后续会描述PowerMockito类功能类似的方法,在此不进行说明。
1.3.2. 对方法进行Suppress
当间接调用被Suppress方法时,Suppress也生效。 可参考示例TestStSuppressPuNVMethodIndirect1类。
1.3.2.1. 使用@PrepareForTest注解
使用PowerMockito.suppress()对方法进行Suppress,需要使用@PrepareForTest注解指定被Suppress的方法对应的类。
当不使用@PrepareForTest注解指定被Suppress方法所在类时,Suppress不生效。可参考示例TestStSuppressFieldNoPrepare1类。
使用PowerMockito.suppress()对方法进行Suppress时,需要传入Method参数,如下所示:
PowerMockito.suppress(PowerMockito.method(TestStaticPublicNonVoid1.class, TestStaticPublicNonVoid1.NAME_TEST1));
被Suppress的方法会被禁止,调用被Suppress的方法时什么也不做,会返回null等值。 可参考示例TestStSuppressPuNVMethodWithPrepare1类。
1.3.2.2. 被Suppress方法的返回值
当方法被Suppress后,返回值为null、0、false等值,与被Suppress字段的值相同,字段值可参考前文。可参考示例TestStSuppressPuNVMethodReturn1类。
1.3.2.3. 使用SuppressCode.suppressMethod()对方法进行Suppress
使用SuppressCode.suppressMethod()可以对方法进行Suppress,可以传入Method对象。使用示例如下,可参考示例TestStSuppressPuNVMethodSuppressCode1类。
SuppressCode.suppressMethod(PowerMockito.method(TestStaticPublicNonVoid1.class, TestStaticPublicNonVoid1.NAME_TEST1));
SuppressCode类还提供了其他对方法进行Suppress,如suppressConstructor()、suppressSpecificConstructor(),以及参数不同的suppressMethod()方法,后续会描述PowerMockito类功能类似的方法,在此不进行说明。
1.3.2.4. 对全部方法(不含构造函数)进行Suppress
使用PowerMockito.methodsDeclaredIn()方法可以获取指定类的全部方法( 不含构造函数 ),再使用PowerMockito类的suppress(Method[] methods)方法,可以对获取的全部方法进行Suppress。示例如下,可参考示例TestStSuppressMethods1类。
PowerMockito.suppress(PowerMockito.methodsDeclaredIn(TestStaticPublicNonVoid1.class));
1.3.2.5. 对全部方法(包含构造函数)进行Suppress
使用PowerMockito.everythingDeclaredIn()方法可以获取指定类的全部方法( 包含构造函数 ),再使用PowerMockito类的suppress(Method[] methods)方法,可以对获取的全部方法进行Suppress。示例如下,可参考示例TestStSuppressEverything1类。
PowerMockito.suppress(PowerMockito.everythingDeclaredIn(TestStaticPublicNonVoid1.class));
1.3.3. 被Suppress字段的值分析
查看PowerMockito.suppress(Field field)方法,调用了SuppressCode类的suppressField(Field… fields)方法。
后续调用了MockRepository类的addFieldToSuppress(Field field)方法,将传入的Field参数添加至Set<Field> suppressField变量中。在MockRepository类的boolean shouldSuppressField(Field field)方法中,返回“suppressField.contains(field) || suppressFieldTypes.contains(field.getType().getName())”。
在MockGateway类的fieldCall()方法中,当MockRepository.shouldSuppressField()方法返回true时,会执行并返回TypeUtils类的getDefaultValue(Class<?> type)方法。
TypeUtils类的getDefaultValue(Class<?> type)方法调用了getDefaultValue(String fullyQualifiedTypeName)方法并返回,在getDefaultValue(String fullyQualifiedTypeName)方法中,对于基本类型byte、int、short默认返回0,long默认返回0L,float默认返回0.0F,double默认返回0.0D,boolean默认返回false,char默认返回’ '( 空格 ),其他类型均返回null,代码如下所示:
if (fullyQualifiedTypeName.equals(byte.class.getName())) {return (byte) 0;
} else if (fullyQualifiedTypeName.equals(int.class.getName())) {return 0;
} else if (fullyQualifiedTypeName.equals(short.class.getName())) {return (short) 0;
} else if (fullyQualifiedTypeName.equals(long.class.getName())) {return 0L;
} else if (fullyQualifiedTypeName.equals(float.class.getName())) {return 0.0F;
} else if (fullyQualifiedTypeName.equals(double.class.getName())) {return 0.0D;
} else if (fullyQualifiedTypeName.equals(boolean.class.getName())) {return false;
} else if (fullyQualifiedTypeName.equals(char.class.getName())) {return ' ';
} else {return null;
}
1.3.4. 被Suppress方法返回值分析
查看PowerMockito.suppress(Method method)方法,调用了SuppressCode类的suppressMethod(Method… methods)方法。
后续调用了MockRepository类的addMethodToSuppress(Method method)方法,将传入的Method参数添加至Set<Method> suppressMethod变量中。在MockRepository类的boolean shouldSuppressMethod(Method method, Class<?> objectType)方法中,遍历suppressMethod变量,当满足其他条件时返回true。
在MockGateway类的doMethodCall()方法中,当MockRepository.shouldSuppressMethod()方法返回true时,会执行并返回TypeUtils类的getDefaultValue(String fullyQualifiedTypeName)方法。后续可参考前文被Suppress字段的值分析。
1.3.5. 对静态代码块进行Suppress
使用@SuppressStaticInitializationFor注解,可以对一个或多个类的静态代码块进行Suppress,需要指定类名字符串。
@SuppressStaticInitializationFor注解中添加的类的静态代码块不会执行。示例如下,可参考TestStSuppressAnnotation1、TestStSuppressAnnotation2类。
@SuppressStaticInitializationFor({"com.adrninistrator.static1.TestStaticPublicNonVoid4"})
public class TestStSuppressAnnotation1
1.3.6. PowerMockito.suppress()方法与静态方法
PowerMockito.suppress()方法支持对静态公有非void方法、公有void方法、私有非void方法、私有void方法进行Suppress。
静态公有非void方法的示例已在前文说明。静态公有void方法、私有非void方法、私有void方法可参考示例TestStSuppressPuVMethod1、TestStSuppressPuVMethod2、TestStSuppressPrNVMethod1、TestStSuppressPrNVMethod2、TestStSuppressPrVMethod1、TestStSuppressPrVMethod2类。
1.4. 对同一个方法执行Mock后Stub、Stub、Replace、Suppress等操作的生效情况
对同一个方法执行Mock后Stub、Stub、Replace、Suppress等操作时,生效的情况比较复杂,最好避免对同一个方法执行以上不同的操作。
- PowerMockito.stub().toReturn()执行多次的生效情况
当PowerMockito.stub().toReturn()对同一个方法执行多次时,最后一次执行的操作生效。可参考TestStEffectiveStubToReturn1类。
- PowerMockito.stub().toThrow()执行多次的生效情况
当PowerMockito.stub().toThrow()对同一个方法执行多次时,最后一次执行的操作生效。可参考TestStEffectiveStubToThrow1类。
- PowerMockito.stub()的toReturn()与toThrow()的生效情况
当PowerMockito.stub().toReturn()与PowerMockito.stub().toThrow()对同一个方法执行时,PowerMockito.stub().toReturn()的操作生效。可参考示例TestStEffectiveStubThrRe1类。
- PowerMockito.replace().with()执行多次的生效情况
当PowerMockito.replace().with()对同一个方法执行多次时,最后一次执行的操作生效。可参考TestStEffectiveReplace1类。
- PowerMockito.stub()与PowerMockito.replace()的生效情况
当PowerMockito.stub().toReturn()、PowerMockito.stub().toThrow()与PowerMockito.replace().with()对同一个方法执行时,PowerMockito.stub().toReturn()的操作生效。可参考示例TestStEffectiveStRe1类。
- PowerMockito.stub().toThrow()与PowerMockito.replace()的生效情况
当PowerMockito.stub().toThrow()与PowerMockito.replace().with()对同一个方法执行时,后执行的操作生效。可参考示例TestStEffectiveStThrRe1类。
- PowerMockito类的stub()、replace()与suppress()的生效情况
当PowerMockito.stub().toReturn()、PowerMockito.stub().toThrow()、PowerMockito.replace().with()与PowerMockito.suppress()对同一个方法执行时,PowerMockito.suppress()的操作生效。可参考示例TestStEffectiveStReSu1类。
- Mockito.when()与PowerMockito.stub().toReturn()的生效情况
当Mockito.when()与PowerMockito.stub().toReturn()对同一个方法执行时,情况如下:
先执行Mockito.when(),再执行PowerMockito.stub().toReturn(),PowerMockito.stub().toReturn()生效;
先执行PowerMockito.stub().toReturn(),再执行Mockito.when(),会出现异常。
使用PowerMockito.when()与使用Mockito.when()的效果相同。
可参考示例TestStEffectiveMockStRet1类。
- Mockito.when()与PowerMockito.stub().toThrow()的生效情况
当Mockito.when()与PowerMockito.stub().toThrow()对同一个方法执行时,情况如下:
若满足Mockito.when()的条件,则执行Mockito.when()指定的操作。可参考示例TestStEffectiveMockStThr1类的test1方法;
若不满足Mockito.when()的条件,且未使用执行真实方法的Answer,则返回默认值。可参考示例TestStEffectiveMockStThr1类的test2方法。
若不满足Mockito.when()的条件,且使用执行真实方法的Answer,则PowerMockito.stub().toThrow()生效。可参考示例TestStEffectiveMockStThr2CallReal类。
- Mockito.when()与PowerMockito.replace()的生效情况
当Mockito.when()与PowerMockito.replace()对同一个方法执行时,情况如下:
若满足Mockito.when()的条件,则执行Mockito.when()指定的操作。可参考示例TestStEffectiveMockRe1类的test1方法;
若不满足Mockito.when()的条件,且未使用执行真实方法的Answer,则返回默认值。可参考示例TestStEffectiveMockRe1类的test2方法。
若不满足Mockito.when()的条件,且使用执行真实方法的Answer,则PowerMockito.replace()生效。可参考示例TestStEffectiveMockRe2CallReal类。
- Mockito.when()与PowerMockito类的stub()、replace()的生效情况
当Mockito.when()与PowerMockito.stub().toReturn()、PowerMockito.stub().toThrow()、PowerMockito.replace()对同一个方法执行时,PowerMockito.stub().toReturn()生效。可参考示例TestStEffectiveMockStRe1类。
- Mockito.when()与PowerMockito.suppress()的生效情况
当Mockito.when()与PowerMockito.suppress()对同一个方法执行时,情况如下:
先执行Mockito.when(),再执行PowerMockito.suppress(),PowerMockito.suppress()生效;
先执行PowerMockito.suppress(),再执行Mockito.when(),会出现异常。
可参考示例TestStEffectiveMockSu1类。
- Mockito.when()与PowerMockito类的stub()、replace()与suppress()的生效情况
当Mockito.when()与PowerMockito.stub().toReturn()、PowerMockito.stub().toThrow()、PowerMockito.replace()、PowerMockito.suppress()对同一个方法执行时,PowerMockito.suppress()生效。可参考示例TestStEffectiveMockStReSu1类。
Java单元测试实践-08.Stub、Replace、Suppress静态方法相关推荐
- Java单元测试实践-15.Stub、Replace、Suppress Spring的方法
Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. Stub. ...
- Java单元测试实践-06.Mock后Stub静态方法
Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. Mock后 ...
- Java单元测试实践-09.Mockito的Stub参数条件
Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. Mocki ...
- Java单元测试实践-11.Mock后Stub Spring的@Component组件
Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. Sprin ...
- Java单元测试实践-01.单元测试概述与示例
Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. 前言 以下 ...
- Java单元测试实践-25.在本地使用H2数据库进行单元测试
Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. 前言 使用 ...
- Java单元测试实践-23.Gradle单元测试日志、报告与JaCoCo代码覆盖率
Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. Gradl ...
- Java单元测试实践-21.使用Gradle执行单元测试
Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. 使用Gra ...
- Java单元测试实践-24.Gradle执行test任务卡死问题解决
Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. Gradl ...
最新文章
- 长篇自动驾驶技术综述论文(下)
- 3月16日云栖精选夜读:显著超越流行长短时记忆网络,阿里提出DFSMN语音识别声学模型...
- 【系统分析与设计】UML协作图绘制方法(真の能看懂~!)
- 【深度学习】19家机构联合发布,200页大模型Roadmap!
- AndroidのActivity之退出返回栈(二)
- python之网络编程 --- TCP编程
- onpropertychange替代方案
- 使用栈实现队列 Implement Queue using Stacks
- JAVA输出两个顺序链表的并集_(顺序表)两个集合求并集-洋葱先生-杨少通
- @Configuration与@Component作为配置类的区别
- 管理感悟:什么是“倾诉式管理”
- 计算机网络物理防护,计算机网络的物理安全
- X波段卡塞格伦天线设计与仿真
- 计算机网络路由交换技术运用,计算机网络路由交换的技术应用与发展趋势研究...
- OpenGL环境搭建指南
- Kubernetes-自动扩展器HPA、VPA、CA
- 轨道交通——信号知识——6202电气集中设备
- 远程主机强迫关闭一个现有连接-=-解决办法
- 盘古开源资讯:夯实产业基础,打造汽车电子芯片产业高地
- 互动媒体技术作业——processing码绘
热门文章
- UnRAR.dll解压rar文件
- 数据库之查询表sc——查询缺少成绩的学生的学号和相应的课程号
- 测试同学反馈,java 程序内存泄露,症状是RSS不断增加超过了jvm的xmx
- X280 工业4g路由器
- c语言用while循环输出九九乘法表,用C语言的while循环,打印九九乘法表
- word删除分页符的两种方法
- webscraper多页爬取_爬虫工具实战篇(Web Scraper)- 京东商品信息爬取(原创)
- linux vim无法退格,Cygwin下安装vim后,vim中退格键无法正常使用的解决方法
- 7月,带你阅读图灵原创图书以及上榜新书
- 刷题总结——玉蟾宫(bzoj3039单调栈)