zoukankan      html  css  js  c++  java
  • PowerMock学习(七)之Mock Constructor的使用

    前言

    我们在编码的时候,总习惯在构造器中传参数,那么在powermock中是怎么模拟带参数构造的呢,这并不难。

    模拟场景

    我们先模拟这样一个场景,通过dao中的传入一个是布尔类型(是否加载)和一个枚举类(使用哪种数据库),构造Dao这个类,在编写一个插入学生方法

    dao部分的代码

    具体示例代码如下:

    package com.rongrong.powermock.mockconstructor;
    
    /**
     * @author rongrong
     * @version 1.0
     * @date 2019/11/28 23:12
     */
    public class StudentConstructorDao {
        public enum DataBaseType{
            MYSQL,
            ORACLE,
        }
    
        /**
         *
         * @param isLoad 数据库是否加载即链接
         * @param dataBaseType 数据库类型
         */
        public StudentConstructorDao(Boolean isLoad,DataBaseType dataBaseType) {
            throw new UnsupportedOperationException();
        }
    
        public void insertStudent(StudentConstructor studentConstructor){
            throw new UnsupportedOperationException();
        }
    }

    service部分代码

    用来调用dao中的函数,具体代码如下:

    package com.rongrong.powermock.mockconstructor;
    
    /**
     * @author rongrong
     * @version 1.0
     * @date 2019/11/28 23:18
     */
    public class StudentConstructorService {
    
        public void createStudnet(StudentConstructor studentConstructor){
            StudentConstructorDao studentConstructorDao = new StudentConstructorDao(false, StudentConstructorDao.DataBaseType.MYSQL);
            studentConstructorDao.insertStudent(studentConstructor);
        }
    }

    编写测试用例

    使用powermock去模拟构造函数,并测试这个service,具体代码如下:

    package com.rongrong.powermock.mockconstructor;
    
    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;
    
    import static com.rongrong.powermock.mockconstructor.StudentConstructorDao.DataBaseType.MYSQL;
    
    /**
     * @author rongrong
     * @version 1.0
     * @date 2019/11/28 23:54
     */
    @RunWith(PowerMockRunner.class)
    @PrepareForTest(StudentConstructorService.class)
    public class TestStudentConstructorService {
    
        @Test
        public void testStudentConstructorService(){
            StudentConstructorDao studentConstructorDao = PowerMockito.mock(StudentConstructorDao.class);
            try {
                //此处需要注释下,需要构造一个带参数的Dao对象,即便是假的也要带参数,该类初始化的时候就带参数
                PowerMockito.whenNew(StudentConstructorDao.class).withArguments(false,MYSQL).thenReturn(studentConstructorDao);
                StudentConstructor studentConstructor = new StudentConstructor();
                StudentConstructorService studentConstructorService = new StudentConstructorService();
                studentConstructorService.createStudnet(studentConstructor);
                Mockito.verify(studentConstructorDao).insertStudent(studentConstructor);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    总结

    • 首先mock了一个StudentConstructorDao对象实例
    • 使用whenNew语法,传入必须入参,注意这里的参数必须和Service中的参数一致,否则会在Service中还会继续创建一个新的StudentConstructorDao实例
    • 接着验证方法的调用

    注意:当不能确定构造器中参数时,使用withAnyArguments()即可,关于Student类代码,参照之前文章Student类,此处略

  • 相关阅读:
    如何使用Flexbox和CSS Grid,实现高效布局
    最常用的四种大数据分析方法
    如何编写更好的SQL查询:终极指南-第三部分
    如何编写更好的SQL查询:终极指南-第二部分
    如何编写更好的SQL查询:终极指南-第一部分
    ES2017异步函数现已正式可用
    相对传统桌面设计器,在线报表设计器价值何在?
    如何实现报表设计中的高精度报表套打?
    2017年前端开发工具趋势
    Angular2 VS Angular4 深度对比:特性、性能
  • 原文地址:https://www.cnblogs.com/longronglang/p/11955111.html
Copyright © 2011-2022 走看看