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

    Mock Final

    mockfinal相对来说就比较简单了,使用powermock来测试使用final修饰的method或class,比较简单,接口调用部分,还是service调用dao。

    对于接口及场景这里就不细说了,特别简单。

    service层

    具体代码示例如下:

    package com.rongrong.powermock.mockfinal;
    
    /**
     * @author rongrong
     * @version 1.0
     * @date 2019/11/27 21:29
     */
    public class StudentFinalService {
    
        private StudentFinalDao studentFinalDao;
    
        public StudentFinalService(StudentFinalDao studentFinalDao) {
            this.studentFinalDao = studentFinalDao;
        }
    
        public void createStudent(Student student) {
            studentFinalDao.isInsert(student);
        }
    }

    dao层

    为了模拟测试,我在dao层的类加了一个final关键字进行修饰,也就是这个类不允许被继承了。

    具体代码如下:

    package com.rongrong.powermock.mockfinal;
    
    
    /**
     * @author rongrong
     * @version 1.0
     * @date 2019/11/27 21:20
     */
    final public class StudentFinalDao {
    
        public Boolean isInsert(Student student){
            throw new UnsupportedOperationException();
        }
    }

    进行单元测试

    为了区分powermock与Easymock的区别,我们先采用EasyMock测试,这里先忽略EasyMock的用法,有兴趣的同学可自行去尝试学习。

    使用EasyMock进行测试

    具体代码示例如下:

        @Test
        public void testStudentFinalServiceWithEasyMock(){
            //mock对象
            StudentFinalDao studentFinalDao = EasyMock.createMock(StudentFinalDao.class);
            Student student = new Student();
            //mock调用,默认返回成功
            EasyMock.expect(studentFinalDao.isInsert(student)).andReturn(true);
            EasyMock.replay(studentFinalDao);
            StudentFinalService studentFinalService = new StudentFinalService(studentFinalDao);
            studentFinalService.createStudent(student);
            EasyMock.verify(studentFinalDao);
        }

    我们先来运行下这个单元测试,会发现运行报错,具体如下图显示:

     很明显由于有final关键字修饰后,导致不能让测试成功,我们可以删除final关键再来测试一下,结果发现,测试通过。

    使用PowerMock进行测试

    具体代码示例如下:

    package com.rongrong.powermock.mockfinal;
    
    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;
    
    /**
     * @author rongrong
     * @version 1.0
     * @date 2019/11/27 22:10
     */
    @RunWith(PowerMockRunner.class)
    @PrepareForTest(StudentFinalDao.class)
    public class TestStudentFinalService {
    
        @Test
        public void testStudentFinalServiceWithPowerMock(){
            StudentFinalDao studentFinalDao = PowerMockito.mock(StudentFinalDao.class);
            Student student = new Student();
            PowerMockito.when(studentFinalDao.isInsert(student)).thenReturn(true);
            StudentFinalService studentFinalService = new StudentFinalService(studentFinalDao);
            studentFinalService.createStudent(student);
            Mockito.verify(studentFinalDao).isInsert(student);
        }
    }

    运行上面的单元测试时,会发现运行通过!!

  • 相关阅读:
    DateTime的精度小问题
    使用For XML PATH 会影响Cross Apply 返回
    一个update的小故事
    行大小计算测试
    Sql Server 2008R2 遇到了BCP导入各种中文乱码的问题
    php-fpm 启动不了 libiconv.so.2找不到
    Git使用教程
    支付宝接口使用文档说明 支付宝异步通知
    Linux(CentOs6.4)安装Git
    NGINX防御CC攻击教程
  • 原文地址:https://www.cnblogs.com/longronglang/p/11946208.html
Copyright © 2011-2022 走看看