在前段时间,由于项目改造导致junit出现了一系列的问题。原项目中使用的easyMock无法支持对静态方法的mock,所以又引入了powermock来mock静态方法。
下面是我mock静态方法过程中遇到的错误:
百度了好久,有很多帖子说的都不全。不是少这个就是少那个。于是我将整个流程记录下来,下面是我的几步走解决方案:
一、引入powermock所需的pom依赖:
这里只是贴出了powermock所需的依赖,如果你的项目中还没有添加junit等相关需要依赖请自行添加。
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.4.12</version>
<scope>test</scope>
</dependency>
二、测试类加上新注解:
下面两个注解都需要添加,如果没有使用@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);