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

本文详细介绍了解决JUnit中静态方法Mock的问题,包括引入PowerMock依赖、添加测试类注解及Mock代码的具体步骤,帮助读者掌握如何在单元测试中正确模拟静态方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在前段时间,由于项目改造导致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);
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值