PowerMockito总结: 一、演变:PowerMock 主要围绕着 Junit 测试框架和 TestNg 测试框架进行,其中在每个框架下面对所涉及的 Mock 框架仅仅支撑 EasyMock 和 Mockito。 二、优势:可以对 final 类型的class和method,类方法(static),局部变量 mock 等等。 三、注解: @RunWith:指定PowerMockRunner运行测试用例,如不指定默认使用Junit提供的Runner。 @PrepareForTest:注解是告诉PowerMock为我提前准备一个需要mock的class。 @InjectMocks:被mock的主类。 @Mock:被mock类中需要调到的类,如工具类。 四、常见场景: 1、模拟私有变量: ①声明一个实例。 ②使用field方法mock变量。 PowerMockito.field(类,文件名).set(实例,mock的结果); set两参: * @param obj the object whose field should be modified * @param value the new value for the field of {@code obj} 2、模拟引用配置文件: ReflectionTestUtils.setField(类,文件名,mock值); 3、模拟公共方法: ①引入类 注解方式(@InjectMocks:主类,@Mock:主类中所引用类),声明方式(new) ②mock方法 PowerMockito.when(method).thenreturn(result); 4、模拟私有方法: ①注解指定类 PrepareForTest注解中添加私有方法所属类; ②mock类为静态 PowerMockito.mockStatic(私有方法所属类); ③mock其方法 PowerMockito.when(方法).thenreturn(结果); 5、模拟Final: ①注解中指定被Final修饰的类 @PrepareForTest(Class.class): ②mock被Final修饰的类 Class aClass = PowerMockito.mock(Class.class); ③mock调用方法并赋予返回值 PowerMockito.when(aClass.method(传参))。thenReturn(返回值); ④验证方法是否被调用 Mockito.verify(aClass).method(传参); 五、其它场景: 1、模拟void无返回值方法: Verify,用以验证方法是否调用。 2、模拟局部变量: ①mock被所需要mock类 Class c = PowerMockito.mock(Class.class); ②mock新生成一个局部变量 PowerMockito.whenNew(Class.class).withNoArguments().thenReturn(“result”); ③声明new一个形参 ④验证局部变量的void方法是否被调用 Mockito.verify(employeeDao).method(形参); 3、无参有返回值: ①mock被所需要mock类 Class c = PowerMockito.mock(C1ass.c1ass); ②mock新生成一个局部变量 PowerMockito.whenNew(Class.class).withNoArguments().thenReturn?; ③mock其方法并mock返回值 PowerMockito.when(c.getMethod()).thenReturn(result); ④断言 assertEquals(mock值,实际值); 4、无参无返回值、有参无返回值:同void 5、有参有返回值: ①mock方法 PowerMockito.when(mock方法).thenreturn(结果): ②调用入口方法 返回数据类型 返回结果 =对象。入口方法名(实参) ③断言 assertEquals(mock值,实际值); 6、模拟静态类: ①模拟静态类 PowerMockito.mockStatic(Class.class) ; ②模拟静态类被调用方法并赋予返回值 ③-1.无返回值 PowerMockito.verifyStatic(); ③-2.有返回值:断言 7、 Verifying:测试工具,检验某个被测试方法是否被顺利调用。 六、方法使用 1、 whenNew 有参构造, whenNew(返回被mock的对象,并非实际产生new行为) whenNew( EmployeeDao. class), withArguments(传参). thenReturn(返回值) spy:mock一个对象,然后再调用其中的某个方法,会据原类所提供的方法来调用 3、 doNothing 此 doNothing方法mock无返回值方法 PowerMockito doNothing (). when(skv,“methodname”,“result”): 4、验证私有方法是否被调用 PowerMockito.verifyPriyate(实例).invoke(“methodname”,“result”); 七、反射覆盖: ①获取类 Class aClass Object getclass(): ②获取方法, parameterTypes-传参数据类型 Method fs= aClass. getDeclaredMethod(methodName", Class<?>… parameterTypes): ③设置可允许 fs. setAccessible(true); ④反射mck方法,实参-具体值 fs, invoke( aclass, newInstance(),实参);
|