用PowerMock mock 临时变量

摘要:
在开发过程中,经常会遇到测试方法调用的类不是通过构造注入的,而是通过临时的new生成的,例如以下要测试的方法:publicclassEmployeeService{privateEmployeeDaoemployeeDao;publicintgetTotalEmployeeWithTempVariable(){EmployeeTaoemploloyeeDau=newEmployee Dao();retu

在开发时,经常遇到这种情况,被测试方法所调用的类不是通过构造注入的,而是通过临时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的构造行为并返回实例

免责声明:文章转载自《用PowerMock mock 临时变量》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇halcon+csharp多图像拼接实现Halcon 单相机标定+消除径向畸变下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ant design pro (十五)advanced 使用 API 文档工具

一、概述 原文地址:https://pro.ant.design/docs/api-doc-cn 在日常开发中,往往是前后端分离的,这个时候约定好一套接口标准,前后端各自独立开发,就不会被对方的技术难点给阻塞住,从而保证项目进度。 在 Ant Design Pro 中我们已经有了一套比较完善的 mock 功能,而roadhog-api-doc工具,则能够从...

webpack4+vue2+axios+vue-router的多页+单页混合应用框架

VUE2的单页应用框架有人分享了,多页应用框架也有人分享了,这里就分享一个单页和多页的混合应用框架吧,初现雏形,还有很多需要优化和改善的地方。。。 结尾有github地址。 项目结构 │ ├─build /* webpack的配置目录 */ │ ├─config.js...

前后端分离--构建前端Mock Server--windows部署rap

mock:模拟的,虚假的 mock server:模拟服务,模拟请求,模拟虚假数据 为了前后端更好的分工,接口文档是必须的,前后端都根据接口文档写代码,然后对接接口就行了。 但是,后端跟不上前端节奏,接口跟不上来怎么办?即便接口跟上来了,大后端数据跟不上又怎么办? 第一种想到的方法就是模拟返回数据,根据接口文档定义好的返回数据格式,新建一个json文件夹,...

【PHP】PHPUnit单元测试利器:PHP Mock的使用方法

由于环境依赖关系,或者是特殊环境的构造要求,这就可能导致我们在测试环境下做验证是很困难的。 当我们无法直接使用的真实被依赖模块时,我们可以用“测试替身”(Test Double)来代替。这个测试替身不需要与真实的被依赖模块有相同的行为,它只需要提供和真实的被依赖模块有相同的API就行了。 PHPUnit提供的getMock($className)方法可以自...

mock测试及jacoco覆盖率

单元测试是保证项目代码质量的有力武器,但是有些业务场景,依赖的第三方没有测试环境,这时候该怎么做Unit Test呢,总不能直接生产环境硬来吧? 可以借助一些mock测试工具来解决这个难题(比如下面要讲的mockito),废话不多说,直奔主题: 一、准备示例Demo 假设有一个订单系统,用户可以创建订单,同时下单后要检测用户余额(如果余额不足,提醒用户充值...

dubbo mock配置

dubbo自身是支持mock服务的,在reference标签里,有一个参数mock,该参数有四个值,false,default,true,或者Mock类的类名。 分别代表如下含义: false,不调用mock服务。 true,当服务调用失败时,使用mock服务。 default,当服务调用失败时,使用mock服务。 force,强制使用Mock服务(不管服...