最近需要写单元测试,用的SpringBoot框架,Mockito无法对静态方法进行Mock。
参考网上很多方法,都说的是Mockito不支持静态方法的Mock,需要使用PowerMockito。
大家的方法大同小异,就引用一个比较简单的例子,参考之一
我选择这位大哥的例子展示原因是,他引用的org.powermock和我的相同,都是1.6.5版本
首先是maven依赖
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.6.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.6.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-testng</artifactId>
<version>1.6.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-core</artifactId>
<version>1.6.5</version>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-support</artifactId>
<version>1.6.5</version>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-reflect</artifactId>
<version>1.6.5</version>
</dependency>
我的静态方法所在的类:StrUtil.class
我的静态方法:public static String getUUID(int length)
public class StrUtil {
public static String getUUID() {
return UUID.randomUUID().toString().replaceAll("-", "");
}
}
主要的方法分两步:
第一步:在单元测试的类上加两个注解:
@RunWith(PowerMockRunner.class)
@PrepareForTest({你的静态方法类名.class})
如下:
@RunWith(PowerMockRunner.class)
@PrepareForTest({StrUtil.class,DateUtil.class})
public class CustomerInfoMessagePackCommandTest{
}
第二步:实例化
PowerMockito.mockStatic(StrUtil.class);
PowerMockito.when(StrUtil.getUUID(30)).thenReturn(“72c90b3f1638432c847e441b4f9ca4”);
如下:
@RunWith(PowerMockRunner.class)
@PrepareForTest({StrUtil.class,DateUtil.class})
public class CustomerInfoMessagePackCommandTest extends PowerMockTestCase {
@BeforeMethod
public void setUp() {
MockitoAnnotations.initMocks(this);
PowerMockito.mockStatic(StrUtil.class);
PowerMockito.when(StrUtil.getUUID(30)).thenReturn("72c90b3f1638432c847e441b4f9ca4");
*********其余代码***************
}
}
但还是一直报错,错误如下:
org.powermock.api.mockito.ClassNotPreparedException:
The class com.newland.commom.util.StrUtil not prepared for test.
To prepare this class, add class to the ‘@PrepareForTest’ annotation.
In case if you don’t use this annotation, add the annotation on class or method level.
一直不知道为什么报错,找了、试了很多网上的办法都没有解决。
最后在一篇帖子(来源:https://www.it-swarm.dev/zh/android/%E6%A8%A1%E6%8B%9F%E6%96%B9%E6%B3%95%E8%B0%83%E7%94%A8%E4%BD%BF%E7%94%A8power-mockito-orgpowermockapimockitoclassnotpreparedexception/826669374/)的评论里有一个方法(如下图),尝试之后就完美解决了。
解决方法:
测试类继承PowerMockTestCase即可,如下图:
最后运行结果: