Mockito&&PowerMockito

  1. Mockito
  2. PowerMockito
    1. 模拟测试方法内的静态方法调用
    2. 模拟测试方法内的对象实例化

Mockito


// 私有变量赋值
FieldSetter.setField(Object target, Field field, Object value);

PowerMockito


PowerMockito需要指定PowerMockRunner 使用PrepareForTest添加需要准备的类


@RunWith(PowerMockRunner.class)
@PrepareForTest({xxxx.class, xxxx.class,.....})
public class ClassA {

}

模拟测试方法内的静态方法调用


//模拟静态类 需要添加 PrepareForTest(StaticClass.class)
//把要模拟的类添加到注解中
PowerMockito.mockStatic(StaticClass.class);

//模拟带返回值静态方法 (先模拟静态类)参数可以用Mockit的any来代替 也可以传入具体的对象  *Note 不能混用
PowerMockito.when(StaticClass.StaticMethod((Mockito.any(),Mockito.anyBoolean())).thenReturn(ReturnObject);

////模拟无返回值静态方法 (先模拟静态类)参数可以用Mockit的any来代替 也可以传入具体的对象  *Note 不能混用
PowerMockito.doNothing().when(StaticClass.class,  "StaticMethod" , Mockito.any(),Mockito.any(),..... );

////模拟无返回值静态方法  发生异常(先模拟静态类)参数可以用Mockit的any来代替 也可以传入具体的对象  *Note 不能混用 原则上被调用方法没有抛出异常是不允许模拟异常的 但是可以用运行时异常强行抛出
PowerMockito.doThrow().when(StaticClass.class,  "StaticMethod" , Mockito.any(),Mockito.any(),..... );

//doNothing doThrow doReturn 可以链式调用 表示方法按次序调用每次发生的事件
//具有返回值的不允许使用 doNothing
//eg: 表示方法被第一次调用返回1 第二次返回空 第三次 发生异常
PowerMockito.doReturn(1).doReturn(null).doThrow(new Exception()).when(StaticClass.class,  "StaticMethod" , Mockito.any(),Mockito.any(),..... );


模拟测试方法内的对象实例化

//eg: 需要模拟A类的实例化 以及xxMethod的调用
public class TestClass {
    public String TestMethod(){
           A a= new A(); 
           String str =a.xxMethod(xxx,xxx);
    }
}

//模拟A 实例化 首先需要模拟A的实例
 A a = PowerMockito.mock(A.class);
 // 当A实例化时候返回这个模拟的a
PowerMockito.whenNew(A.class).withNoArguments().thenReturn(a);
//调用xxMethod
PowerMockito.when(a.xxMethod(Mockito.any(),Mockito.any(),Mockito.any().... ) ).thenReturn(Object);//

////模拟无返回值方法 (先模拟静态类)参数可以用Mockit的any来代替 也可以传入具体的对象  *Note 不能混用
PowerMockito.doNothing().when(a).Method( Mockito.any(),Mockito.any(),.....);

////模拟无返回值方法  发生异常(先模拟静态类)参数可以用Mockit的any来代替 也可以传入具体的对象  *Note 不能混用
PowerMockito.doThrow().when(a).Method( Mockito.any(),Mockito.any(),.....);