首页 > 其他分享 >使用PowerMock来mock静态方法

使用PowerMock来mock静态方法

时间:2024-04-06 09:23:42浏览次数:28  
标签:java powermock mockito MethodRoadie org 静态方法 PowerMock junit mock

使用

引入依赖

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>2.0.9</version>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>2.0.2</version>
</dependency>

代码实现

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest({TestPowerMock.PersonUtil.class})
public class TestPowerMock {

    @Test
    public void testCheckParam() throws Exception {
        PowerMockito.mockStatic(PersonUtil.class);
        Mockito.when(PersonUtil.checkParam()).thenReturn(true);
        boolean result = PersonUtil.checkParam();
        System.out.println(result);
    }


    static class PersonUtil {
        public static boolean checkParam() {
            throw new RuntimeException("check error");
        }
    }
}

总结

  1. 使用了powermock,会代替 mockito 本身的模拟静态方法的实现,就不能使用 Mockito.mockStatic() 这种方式了。

  2. 也不能引入 mockito-inline 的依赖,不然报错

    org.mockito.exceptions.misusing.NotAMockException: Argument should be a mock, but is: class java.lang.Class
    
    at com.imooc.TestPowerMock.testCheckParam(TestPowerMock.java:17)
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
    at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
    

    不能引入依赖为

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-inline</artifactId>
        <version>3.8.0</version>
    </dependency>
    

    具体原因为 powermock 扩展了 mockito 的 MockMaker 的实现,如果还引入 mockito-inline 依赖,就会将扩展实现给覆盖。

参考

Mockito简介(转)

标签:java,powermock,mockito,MethodRoadie,org,静态方法,PowerMock,junit,mock
From: https://www.cnblogs.com/strongmore/p/18033232

相关文章

  • 使用Mockito来mock静态方法和接口的default方法
    使用引入依赖<dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>3.8.0</version></dependency>代码实现importorg.mockito.MockedStatic;importorg.mockito.Mockito;......
  • 【进来一起刷Java题】Java中使用空对象引用调用静态方法的奇特现象 附题目+解析 | ((Te
    目录一、题目二、解析三、答案:一、题目有关下述Java代码描述正确的选项是____。答案直接点目录里的跳转。publicclassTestClass{  privatestaticvoidtestMethod(){    System.out.println("testMethod");  }  publicstaticvoidmain(Str......
  • 大屏可视化项目示例--基于Vue3+vite2+echart+mock+axios+dataV
    图例: 项目环境:Vite、Echarts、Npm、Node、axios、mock、vue3、dataV。项目地址:IofTV-Screen-Vue3:......
  • 什么时候使用静态方法,面向对象编程,设计模式,php编程
    静态方法在编程中有多种适用情况,以下是一些常见的使用场景:1.**工具类或辅助函数**:当你需要创建一个类来提供一些与类本身的实例无关的工具方法或辅助函数时,静态方法是很合适的。这些方法可以直接通过类名来调用,而无需创建类的实例。2.**计算或常量**:如果有一些计算或常量与......
  • python 实例属性、类属性、实例方法、类方法、静态方法
    classPeople():peoCount=0#类属性def__init__(self,name,age):#实例属性self.__name=nameself.__age=agePeople.peoCount+=1defgetProperty(self):#定义实例方法returnself.__dict__@cla......
  • Mockito之doThrow
    1、如果一个对象的方法的返回值是void,那么不能用when…thenThrow让该方法抛出异常。(1)如果有返回值,下面这种写法是错误的:importorg.junit.Test;importorg.mockito.Mock;importorg.mockito.MockitoAnnotations;importstaticorg.mockito.Mockito.when;publicclas......
  • Easy Mock的部署及使用
    EasyMock是一个可视化,并且能快速生成模拟数据的持久化服务。GitHub地址:https://github.com/easy-mock/easy-mock中文介绍文档:https://github.com/easy-mock/easy-mock/blob/dev/README.zh-CN.md一、部署1.传统部署建议使用docker部署,传统部署坑太多了参考:https://coder......
  • requests---requests-mock的简单介绍
    前言在日常测试过程中或者研发开发过程中,目前接口暂时没有开发完成,测试人员又要提前介入接口测试中,测试人员不仅仅只是简单的编写测试用例,也可以通过一些mock的方法进行来提前根据接口测试的情况进行模拟返回接口的信息,进行模拟接口各种场景的异常。requests-mockrequests-......
  • Android第一行代码——快速入门 Kotlin 编程(3.7 Kotlin课堂:标准函数和静态方法)
    目录3.7        Kotlin课堂:标准函数和静态方法3.7.1    标准函数with、run和apply3.7        Kotlin课堂:标准函数和静态方法        现在我们即将进入本书首次的Kotlin课堂,之后的几乎每一章中都会有这样一个环节。虽说目前你已经可......
  • 在YAPI中使用mock.js语法编写接口
    1.问题编写完json数据后,尝试过导入json和json-schema,YAPI总是无法将mock语法转化相应数据1.1导入json的方式不支持mock语法1.2导入json-schema的方式识别不了我写的mock语法json2.解决先在设置中开启json5,再关闭如图所示的按钮显示如下图所示即成功......