• PowerMock学习(三)之Mock局部变量


    编写powermock用例步骤:

    • 类上面先写这两个注解@RunWith(PowerMockRunner.class)、@PrepareForTest(StudentService.class)
    • 先模拟一个假对象即studentdao方法中的局部变量
    • 用无参的方式new对象
    • 再模拟这个对象被调用时,是否有返回,有返回值给出默认值,没有用doNothing()
    • 验证有返回值使用assertEquals即可,无返回值使用Mockito.verify验证

    实际案例

    接着上一篇文章中的代码,修改下service中的代码,这次我不通过构造器注入Dao,在方法中new一个StudentDao,创建一个名为StudentNewService的类。

    具体示例代码如下:

    package com.rongrong.powermock.service;
    
    import com.rongrong.powermock.dao.StudentDao;
    
    /**
     * @author rongrong
     * @version 1.0
     * @date 2019/11/17 21:13
     */
    public class StudentNewService {
    
    
        /**
         * 获取学生个数
         * @return返回学生总数
         */
        public int getTotal() {
            StudentDao studentDao = new StudentDao();
            return studentDao.getTotal();
        }
    
        /**
         * 创建学生
         * @param student
         */
        public void createStudent(Student student) {
            StudentDao studentDao = new StudentDao();
            studentDao.createStudent(student);
        }
    }

    针对上面修改部分代码,进行单元测试,以下代码有采用传统方式测试和采用powermock方式进行测试,具体代码如下:

    package com.rongrong.powermock.service;
    
    import com.rongrong.powermock.dao.StudentDao;
    import org.junit.Assert;
    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 org.junit.Assert.assertEquals;
    import static org.junit.Assert.fail;
    
    /**
     * @author rongrong
     * @version 1.0
     * @date 2019/11/20 21:42
     */
    @RunWith(PowerMockRunner.class)
    @PrepareForTest(StudentNewService.class)
    public class TestNewStudentService {
    
        /**
         * 传统方式测试
         */
        @Test
        public void testGetStudentTotal() {
            StudentNewService studentNewService = new StudentNewService();
            int total = studentNewService.getTotal();
            assertEquals(total, 10);
        }
    
        /**
         * @desc测试有返回值类型 采用powermock进行测试获取学生个数
         */
        @Test
        public void testGetStudentTotalWithPowerMock() {
            //先模拟一个假对象即studentdao方法中的局部变量
            StudentDao studentDao = PowerMockito.mock(StudentDao.class);
            try {
                //这句话我按照英文理解就是,我用无参的方式new了一个StudentDao对象
                PowerMockito.whenNew(StudentDao.class).withNoArguments().thenReturn(studentDao);
                //再模拟这个对象被调用时,我们默认假定返回10个证明调用成功
                PowerMockito.when(studentDao.getTotal()).thenReturn(10);
                //这里就是service就不用再说了
                StudentNewService studentNewService = new StudentNewService();
                int total = studentNewService.getTotal();
                assertEquals(total, 10);
            } catch (Exception e) {
                fail("测试失败了!!!");
                e.printStackTrace();
            }
    
        }
    
        /**
         * @desc测试的无返回值类型 采用powermock进行测试创建学生
         */
        @Test
        public void testCreateStudentWithPowerMock() {
            //先模拟一个假对象即studentdao方法中的局部变量
            StudentDao studentDao = PowerMockito.mock(StudentDao.class);
            try {
                //这句话我按照英文理解就是,我用无参的方式new了一个StudentDao对象
                PowerMockito.whenNew(StudentDao.class).withNoArguments().thenReturn(studentDao);
                Student student = new Student();
                //这句话注释与否都能运行通过,也就是我只能判断他是否被调用
                //PowerMockito.doNothing().when(studentDao).createStudent(student);
                //这里就是service就不用再说了
                StudentNewService studentNewService = new StudentNewService();
                studentNewService.createStudent(student);
                Mockito.verify(studentDao).createStudent(student);
            } catch (Exception e) {
                fail("测试失败了!!!");
                e.printStackTrace();
            }
    
        }
    
    }

    运行上面的测试用例,会发现第一个失败,后面两个都运行成功,即有返回值和无返回值类型的测试(void类型)。

    注意:对于无返回值类型的测试,只能验证其是否被调用,这里还请注意。

  • 相关阅读:
    作用域链及作用域面试题
    this在js中的作用
    dom对象
    作用域问题
    逻辑运算
    socket.io 的使用
    mongoDB 的使用
    使用 usb 调试的时候,连接上电脑没反应
    uni-app 的更新及碰到的问题
    WebSocket 的使用
  • 原文地址:https://www.cnblogs.com/longronglang/p/11901591.html
Copyright © 2020-2023  润新知