zoukankan      html  css  js  c++  java
  • 用PowerMock mock 临时变量

    在开发时,经常遇到这种情况,被测试方法所调用的类不是通过构造注入的,而是通过临时new出来的,如下面待测方法:

    public class EmployeeService {
        private EmployeeDao employeeDao;
    
    
        public int getTotalEmployeeWithTempVariable() {
            EmployeeDao employeeDao = new EmployeeDao();
            return employeeDao.getTotal();
        }
    }

    employeeDao是临时new出来的,而mockito和easyMock一般是通过代理来实现mock,这时就无法mock此类方法了。

    而PowerMock通过直接修改class,使这类方法可测,

    @PrepareForTest(EmployeeService.class)
    public class EmployeeServiceTest extends PowerMockTestCase {
    
        EmployeeService employeeService;
    
        @ObjectFactory
        public ITestObjectFactory getObjectFactory() {
            return new PowerMockObjectFactory();
        }
        @BeforeMethod
        public void init(){
             employeeService = new EmployeeService(employeeDao);
        }
        
        @Test
        public void testGetTotalEmployeeWithTempVariable() {
            try {
                PowerMockito.whenNew(EmployeeDao.class).withNoArguments()
                        .thenReturn(employeeDao);
                PowerMockito.when(employeeDao.getTotal()).thenReturn(10);
                int total = employeeService.getTotalEmployeeWithTempVariable();
                assertEquals(10, total);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    这里有三个很重要的地方:

    @PrepareForTest(EmployeeService.class):告诉PowerMock,需要修改EmployeeService的class文件

    @ObjectFactory:告诉testNG以对象工厂的形式创建测试实例

    extends PowerMockTestCase :继承此接口

    此外需要

    PowerMockito.whenNew(EmployeeDao.class).withNoArguments()
    .thenReturn(employeeDao);

    录制EmployeeDao的构造行为并返回实例

  • 相关阅读:
    团队法则100条
    How To Install and Use Redis
    李元芳履职梗概
    免费私有gitLab服务推荐
    Tornado、Bottle以及Flask
    Top Open Source Projects to Watch in 2017
    openmediavault 4.1.3 插件开发
    前端面试绝对会考的JS问题!【已经开源】
    使用window.open打开新窗口被浏览器拦截的解决方案
    微信小程序的坑之wx.miniProgram.postMessage
  • 原文地址:https://www.cnblogs.com/changzhz/p/5162212.html
Copyright © 2011-2022 走看看