SpringBoot单元测试遇到静态方法org.powermock.api.mockito.ClassNotPreparedException:

最近需要写单元测试,用的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即可,如下图:
在这里插入图片描述

最后运行结果:
在这里插入图片描述

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值