mock静态方法,错误(requires an argument which has to be 'a method call on a mock')详讲

在前段时间,由于项目改造导致junit出现了一系列的问题。原项目中使用的easyMock无法支持对静态方法的mock,所以又引入了powermock来mock静态方法。

下面是我mock静态方法过程中遇到的错误:

mock静态方法,错误(requires an argument which has to be 'a method call on a mock')详讲_第1张图片

百度了好久,有很多帖子说的都不全。不是少这个就是少那个。于是我将整个流程记录下来,下面是我的几步走解决方案:

一、引入powermock所需的pom依赖:

这里只是贴出了powermock所需的依赖,如果你的项目中还没有添加junit等相关需要依赖请自行添加。


  
    org.powermock  
    powermock-api-mockito  
    1.4.12  
    test  
 
   
  
    org.powermock  
    powermock-module-junit4  
    1.4.12  
    test  

二、测试类加上新注解:

下面两个注解都需要添加,如果没有使用@PrepareForTest注解,那么@RunWith(PowerMockRunner.class)是可以不加。

@RunWith(PowerMockRunner.class)语句告诉JUnit用PowerMockRunner来执行测试。 
@PrepareForTest(Utils.class)语句告诉PowerMock准备Utils类进行测试。适用于模拟final类或有final, private, static, native方法的类。(当然我原项目中还使用的EasyMock对普通类方法进行模拟,所以这里添加的就是我需要mock的静态类)

@RunWith(PowerMockRunner.class)
//需要mock的静态方法所在的类,可以是多个使用“,”号分隔
@PrepareForTest({AOSEConfig.class , Utils.class}) 

 

三、Mock代码:

PowerMockito.mockStatic(Utils.class);
Mockito.when(Utils.isExist(Mockito.anyString())).thenReturn(true);

PowerMockito.mockStatic(Utils.class);

指定你所需要的mock的静态方法所在的类,以我为例我所需要mock的静态方法在Utils类中,那么括号中就需要指定Utils类。


Mockito.when(Utils.isExist(Mockito.anyString())).thenReturn(true);

Utils.isExist():这个是你所需要mock的方法,你需要对你的mock的方法指定相应的参数。

我这里的方法只需要接收一个String类型的参数,所以写法为:Utils.isExist(Mockito.anyString())

如果该方法需要接收两个参数,一个String、一个int写法为:Utils.isExist(Mockito.anyString(),Mockito.anyInt())

thenReturn():括号中是该方法的返回数据,可以是一个自定义的对象,比如:

Student  s = new Student();

s.setName("张三");

s.setAge(21);

Mockito.when(Utils.isExist(Mockito.anyString())).thenReturn(s);

 

以上就是本次的所有代码,当你mock成功后调用该静态方法就会返回你thenReturn中所设定的预期值。当然可能你某一个静态方法在junit很多测试方法中都需要调用,那么你可以将它写到@Before初始化方法中。代码如下:

@Before
public void setUp() throws Exception{
    PowerMockito.mockStatic(Utils.class);
    Mockito.when(Utils.isExist(Mockito.anyString())).thenReturn(true);
}

 

 

你可能感兴趣的:(mock静态方法,错误(requires an argument which has to be 'a method call on a mock')详讲)