简单介绍如何使用powermock和mockito来mock 1. 构造函数 2. 静态函数 3. 枚举实现的单例 4. 选择参数值做为函数的返回值 -凯发k8网页登录

天平山上白云泉,云自无心水自闲。何必奔冲山下去,更添波浪向人间!
posts - 288, comments - 524, trackbacks - 0, articles - 6
  凯发k8网页登录-凯发天生赢家一触即发官网 :: 凯发k8网页登录首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
本文将简单介绍如何使用powermock和mockito来mock
1. 构造函数
2. 静态函数
3. 枚举实现的单例
4. 选择参数值做为函数的返回值
5. 在调用mock出来的方法中,改变方法参数的值

一点简要说明:mockito其实已经可以满足大部分的需求,但是它的实现机制是使用cglib来动态创建接口的类的实例。但是这种实现方式不能用于构造函数和静态函数,因为那需要使用类的字节码(比如使用javassist). 所以我们才需要结合使用powermock.

1. mock构造函数, 如果有代码没有使用di注入依赖实例,在单元测试中可以使用powermock来模拟创建对象。
注意的开始两行的2个注解 @runwith 和 @preparefortest
@runwith比较简单,后面始终是powermockrunner.class
@preparefortext后面需要加的是调用构造函数的类名,而不是有构造函数的类本身。
在下面的例子中,我们要测试的类是:helper, 在helper类中调用了somthing类的构造函数来创建实例。
@runwith(powermockrunner.class)
@preparefortest(helper.
class)
public class helpertest {
  @mock
  
private something mocksomething;
      
  @injectmocks
  
private helper helper;
      
  @test
  
public void dosomething() throws exception {
      string argument 
= "arg";
          
      powermockito.whennew(something.
class).witharguments(argument).thenreturn(mocksomething);
         
      // 调用需要测试方法
      helper.dosomething(argument);
         
      // 进行验证
      verify(mocksomething).doit();
  }
}


public class helper {
  public void dosomething(string arg) {
      something something = new something(arg);
      something.doit();
  }
}


2,mock 静态函数, 单例模式就是一个典型的会调用静态函数的例子。 注意要点与mock构造函数相同。
class classwithstatics {
  
public static string getstring() {
    
return "string";
  }

  
public static int getint() {
    
return 1;
  }
}

@runwith(powermockrunner.
class)
@preparefortest(classwithstatics.
class)
public class stubjustonestatic {
  @test
  
public void test() {
    powermockito.mockstatic(classwithstatics.
class);

    when(classwithstatics.getstring()).thenreturn(
"hello!");

    system.out.println(
"string: "  classwithstatics.getstring());
    system.out.println(
"int: "  classwithstatics.getint());
  }
}

3。mock枚举实现的单例
singletonobject.java
public enum singletonobject { 
    instance
;
    private
int num;
    protected
void setnum(int num) {
        this.num = num;
    }
    public int getnum() {
        return
num;
    }

}
singletonconsumer.java

public class singletonconsumer {
    public string consumesingletonobject() { 
        return
string.valueof(singletonobject.instance.getnum());
    }
}
singletonconsumertest.java
@runwith(powermockrunner.class) 
@preparefortest({singletonobject.class})
public class singletonconsumertest {
    @test public void testconsumesingletonobject() throws exception {
        singletonobject
mockinstance = mock(singletonobject.class);
        whitebox
.setinternalstate(singletonobject.class, "instance", mockinstance);
        when
(mockinstance.getnum()).thenreturn(42);
        assertequals
("42", new singletonconsumer().consumesingletonobject());
    }
}
4。返回参数值做为函数返回值。
mockito 1.9.5之后,提供一个方便的方法来实现这个需要,在这之前可以使用一个匿名函数来返回一个answer来实现。
when(mymock.myfunction(anystring())).then(returnsfirstarg());
其中returnsfirstarg()是org.mockito.additionalanswers中的一个静态方法。
在这个类中还有其他的一些类似方法
returnssecondarg()
returnslastarg()
returnsargumentat(int position)

5. 在调用mock出来的方法中,改变方法参数的值
when( mymock.somemethod( any( list.class ) ) ).thenanswer( ( new answer<void>() {
    @override
    
public void answer( invocationonmock invocation )
            
throws throwable {
        object[] args 
= invocation.getarguments();
        list arg1 
= (list)args[0];
        arg1.add(
"12345");
        
return null;
    }
} ) );



verifying with generic parameters
verify(someservice).process(matchers.<collection<person>>any());
verify(adunomasterbaseprocessor).processbinfiles( anylistof(file.class) );



只有注册用户后才能发表评论。


网站导航:
              
 
网站地图