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()对同一个方法执行时,情况如下:

  1. 先执行Mockito.when(),再执行PowerMockito.stub().toReturn(),PowerMockito.stub().toReturn()生效;

  2. 先执行PowerMockito.stub().toReturn(),再执行Mockito.when(),会出现异常。

使用PowerMockito.when()与使用Mockito.when()的效果相同。

可参考示例TestStEffectiveMockStRet1类。

  • Mockito.when()与PowerMockito.stub().toThrow()的生效情况

当Mockito.when()与PowerMockito.stub().toThrow()对同一个方法执行时,情况如下:

  1. 若满足Mockito.when()的条件,则执行Mockito.when()指定的操作。可参考示例TestStEffectiveMockStThr1类的test1方法;

  2. 若不满足Mockito.when()的条件,且未使用执行真实方法的Answer,则返回默认值。可参考示例TestStEffectiveMockStThr1类的test2方法。

  3. 若不满足Mockito.when()的条件,且使用执行真实方法的Answer,则PowerMockito.stub().toThrow()生效。可参考示例TestStEffectiveMockStThr2CallReal类。

  • Mockito.when()与PowerMockito.replace()的生效情况

当Mockito.when()与PowerMockito.replace()对同一个方法执行时,情况如下:

  1. 若满足Mockito.when()的条件,则执行Mockito.when()指定的操作。可参考示例TestStEffectiveMockRe1类的test1方法;

  2. 若不满足Mockito.when()的条件,且未使用执行真实方法的Answer,则返回默认值。可参考示例TestStEffectiveMockRe1类的test2方法。

  3. 若不满足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()对同一个方法执行时,情况如下:

  1. 先执行Mockito.when(),再执行PowerMockito.suppress(),PowerMockito.suppress()生效;

  2. 先执行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静态方法相关推荐

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

    Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. Stub. ...

  2. Java单元测试实践-06.Mock后Stub静态方法

    Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. Mock后 ...

  3. Java单元测试实践-09.Mockito的Stub参数条件

    Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. Mocki ...

  4. Java单元测试实践-11.Mock后Stub Spring的@Component组件

    Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. Sprin ...

  5. Java单元测试实践-01.单元测试概述与示例

    Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. 前言 以下 ...

  6. Java单元测试实践-25.在本地使用H2数据库进行单元测试

    Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. 前言 使用 ...

  7. Java单元测试实践-23.Gradle单元测试日志、报告与JaCoCo代码覆盖率

    Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. Gradl ...

  8. Java单元测试实践-21.使用Gradle执行单元测试

    Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. 使用Gra ...

  9. Java单元测试实践-24.Gradle执行test任务卡死问题解决

    Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. Gradl ...

最新文章

  1. 长篇自动驾驶技术综述论文(下)
  2. 3月16日云栖精选夜读:显著超越流行长短时记忆网络,阿里提出DFSMN语音识别声学模型...
  3. 【系统分析与设计】UML协作图绘制方法(真の能看懂~!)
  4. 【深度学习】19家机构联合发布,200页大模型Roadmap!
  5. AndroidのActivity之退出返回栈(二)
  6. python之网络编程 --- TCP编程
  7. onpropertychange替代方案
  8. 使用栈实现队列 Implement Queue using Stacks
  9. JAVA输出两个顺序链表的并集_(顺序表)两个集合求并集-洋葱先生-杨少通
  10. @Configuration与@Component作为配置类的区别
  11. 管理感悟:什么是“倾诉式管理”
  12. 计算机网络物理防护,计算机网络的物理安全
  13. X波段卡塞格伦天线设计与仿真
  14. 计算机网络路由交换技术运用,计算机网络路由交换的技术应用与发展趋势研究...
  15. OpenGL环境搭建指南
  16. Kubernetes-自动扩展器HPA、VPA、CA
  17. 轨道交通——信号知识——6202电气集中设备
  18. 远程主机强迫关闭一个现有连接-=-解决办法
  19. 盘古开源资讯:夯实产业基础,打造汽车电子芯片产业高地
  20. 互动媒体技术作业——processing码绘

热门文章

  1. UnRAR.dll解压rar文件
  2. 数据库之查询表sc——查询缺少成绩的学生的学号和相应的课程号
  3. 测试同学反馈,java 程序内存泄露,症状是RSS不断增加超过了jvm的xmx
  4. X280 工业4g路由器
  5. c语言用while循环输出九九乘法表,用C语言的while循环,打印九九乘法表
  6. word删除分页符的两种方法
  7. webscraper多页爬取_爬虫工具实战篇(Web Scraper)- 京东商品信息爬取(原创)
  8. linux vim无法退格,Cygwin下安装vim后,vim中退格键无法正常使用的解决方法
  9. 7月,带你阅读图灵原创图书以及上榜新书
  10. 刷题总结——玉蟾宫(bzoj3039单调栈)