相关文章推荐
玩足球的馒头  ·  介绍linux/windows ...·  6 月前    · 
忐忑的机器猫  ·  show partitions ...·  1 年前    · 
长情的大脸猫  ·  INTERSECT function ...·  1 年前    · 


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

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

Java junit mock静态方法 mock静态方法抛出异常_Java junit 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);