首页 > 其他分享 >使用Mockito来mock静态方法和接口的default方法

使用Mockito来mock静态方法和接口的default方法

时间:2024-04-05 21:33:46浏览次数:29  
标签:personService mockito 静态方法 default checkParam Mockito static mock

使用

引入依赖

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

代码实现

import org.mockito.MockedStatic;
import org.mockito.Mockito;

public class TestMockito {
    public static void main(String[] args) {

//        testMockNormalMethod();
//        testMockDefaultMethod();
        testMockStaticMethod();
    }

    /**
     * mock 静态方法
     */
    private static void testMockStaticMethod() {
        //高版本3.4.0才支持
        try (MockedStatic<PersonUtil> mockStatic = Mockito.mockStatic(PersonUtil.class);) {
            mockStatic.when(() -> PersonUtil.checkParam()).thenReturn(false);
            System.out.println(PersonUtil.checkParam());
        }
    }

    /**
     * mock java8的默认方法
     */
    private static void testMockDefaultMethod() {
        PersonServiceImpl personService = Mockito.spy(PersonServiceImpl.class);
        Mockito.when(personService.checkParam(Mockito.any())).thenReturn(true);
        personService.savePerson(new Object());
    }

    /**
     * mock正常方法
     */
    private static void testMockNormalMethod() {
        PersonServiceImpl personService = Mockito.mock(PersonServiceImpl.class);
        Mockito.when(personService.getPerson(Mockito.any())).thenReturn("lisi");
        System.out.println(personService.getPerson("abc"));
    }

    interface PersonService {
        default boolean checkParam(Object obj) {
            System.out.println("check param: " + obj);
            return false;
        }
    }

    static class PersonServiceImpl implements PersonService {

        public Object getPerson(String name) {
            return name;
        }

        public void savePerson(Object obj) {
            boolean check = checkParam(obj);
            if (check) {
                System.out.println("save person success");
            } else {
                System.out.println("save person fail");
            }
        }
    }

    static class PersonUtil {

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

总结

  1. mock默认方法需要使用 spy 方法
  2. mock静态方法需要添加如下依赖(版本必须为 3.4.0 及以上),不然会报错
    Exception in thread "main" org.mockito.exceptions.base.MockitoException: 
    The used MockMaker SubclassByteBuddyMockMaker does not support the creation of static mocks
    
    Mockito's inline mock maker supports static mocks based on the Instrumentation API.
    You can simply enable this mock mode, by placing the 'mockito-inline' artifact where you are currently using 'mockito-core'.
    Note that Mockito's inline mock maker is not supported on Android.
    	at com.imooc.TestMockito.testMockStaticMethod(TestMockito.java:19)
    	at com.imooc.TestMockito.main(TestMockito.java:11)
    
    添加依赖为
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-inline</artifactId>
        <version>3.8.0</version>
    </dependency>
    

标签:personService,mockito,静态方法,default,checkParam,Mockito,static,mock
From: https://www.cnblogs.com/strongmore/p/18033102

相关文章

  • Running the installer as administrator is disabled by default, see https://githu
    在windows安装scoops提示 网上找到解决办法安装失败-安装scoop失败:“默认情况下,以管理员身份运行安装程序处于禁用状态,请参阅https://github.com/ScoopInstaller/Install#for-admin”-堆栈溢出---failedinstallation-Installingscoopfails:"Runningtheinstal......
  • 【进来一起刷Java题】Java中使用空对象引用调用静态方法的奇特现象 附题目+解析 | ((Te
    目录一、题目二、解析三、答案:一、题目有关下述Java代码描述正确的选项是____。答案直接点目录里的跳转。publicclassTestClass{  privatestaticvoidtestMethod(){    System.out.println("testMethod");  }  publicstaticvoidmain(Str......
  • 【教程】宝塔default.db占用空间几十g解决方法|宝塔占用磁盘空间特别大解决方法|宝塔
    目录一、前言二、排查问题三、解决方法一、前言用过宝塔创建网站,大家应该都非常熟悉,但是用随着用的时间越来越多,宝塔所占用的空间也越来越多,不停的加大数据盘都没有用,我原先买了30G够用了,随着时间一长,发现数据盘又满了,不得不又买了20个G扩容,可是过了一段时间又满了。......
  • FlinkSQL Unable to create a source for reading table 'default_catalog.default_da
    问题描述使用FlinkSql的jdbc连接器读取mysql的一张表,总是提示 Exceptioninthread"main"org.apache.flink.table.api.ValidationException:Unabletocreateasourceforreadingtable'default_catalog.default_database程序代码publicstaticvoidmai......
  • MySQL数据库报错:ERROR 1364 (HY000): Field ‘authentication_string‘ doesn‘t have
    在MySQL安装和配置的过程中,遇到错误可能会让人感到困惑,尤其是当错误信息不够清晰时。本文将详细探讨一个在MySQL安装过程中较少见但可能会遇到的错误,提供一个全面的解决方案指南。错误描述在MySQL安装过程中,可能会遇到以下错误信息:ERROR1364(HY000):Field'authentica......
  • 什么时候使用静态方法,面向对象编程,设计模式,php编程
    静态方法在编程中有多种适用情况,以下是一些常见的使用场景:1.**工具类或辅助函数**:当你需要创建一个类来提供一些与类本身的实例无关的工具方法或辅助函数时,静态方法是很合适的。这些方法可以直接通过类名来调用,而无需创建类的实例。2.**计算或常量**:如果有一些计算或常量与......
  • python 实例属性、类属性、实例方法、类方法、静态方法
    classPeople():peoCount=0#类属性def__init__(self,name,age):#实例属性self.__name=nameself.__age=agePeople.peoCount+=1defgetProperty(self):#定义实例方法returnself.__dict__@cla......
  • 【 Java系列】--基础篇-1、认识接口中的default关键字
    原创:朱老师缘神日记default关键字:是在Java8中引入的新概念,也可称为Virtualextensionmethods——虚拟扩展方法,它与public、private等都属于修饰符关键字,与其它两个关键字不同之处在于default关键字大部分都用于修饰接口。default修饰方法时只能在接口类中使用,在接口中......
  • Mockito之doThrow
    1、如果一个对象的方法的返回值是void,那么不能用when…thenThrow让该方法抛出异常。(1)如果有返回值,下面这种写法是错误的:importorg.junit.Test;importorg.mockito.Mock;importorg.mockito.MockitoAnnotations;importstaticorg.mockito.Mockito.when;publicclas......
  • 浅谈C# Linq里的FirstOrDefault,First,Single,SingleOrDefault 方法
    FirstOrDefault:返回第一个元素,如果为空,则返回类型的默认值;数值类型默认值是0,引用类型默认值是NULL,布尔类型默认值是FalseFirst:也是返回第一个元素,但是如果为空的话,会抛出异常!!Single:返回唯一一个符合条件的元素,如若没有或者有多条,都会抛出异常!SingleOrDefault:返回唯一一个......