单元测试实战——Mock当前类的私有方法

2,666 阅读1分钟

一、背景

新写了一个私有方法,在写单元测试代码时,发现一个私有方法需要mock,Mockito无法实现,于是引入了PowerMockito

二、PowerMock

1.PowerMock简介

PowerMockito扩展了EasyMock和Mockito框架,实现了对静态方法,构造方法、私有方法以及final方法的模拟支持。

2.PowerMock和Mockito版本

PowerMockito引入时,要根据Mockito版本选择对应版本,否则运行单测时会出现各种奇怪报错。 image.png

3.推荐使用的版本

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>2.10.0</version>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>2.0.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>2.0.2</version>
    <scope>test</scope>
</dependency>

三、实战

0. Demo

public class Trade { 
    
    public double findAmountByType(double originalAmount, String type) { 
        double rate = this.getRateByType(type);
        return originalAmount * rate;
    }
    
    private boolean getRateByType(String type) {
        // xxx
    }
    
}

1.mock当前类的私有方法

    @RunWith(PowerMockRunner.class) // 代表该测试类使用PowerMock
    @PrepareForTest({Trade.class})  // 告诉PowerMock哪些类需要字节码级别操作
    @PowerMockIgnore({"javax.management.*"}) // 忽略一些字节码相关的类,防止ClassCastException
    public class Test {
        
        @Test
        public void testFindAmountByType() {
            Trade trade = PowerMockito.spy(new Trade()); // 通过PowerMock初始化要测试的类
            PowerMockito.doReturn(10d).when(trade, "getRateByType", "USA"); // mock方法返回值,返回值设置在doReturn中,when方法的参数第一个是mock的对象,第二个是方法名字,后面的是方法参数
            double res = trade.findAmountByType(10, "USA"); // 调用要测试的方法
            System.out.println(res);
            Assert.assertEqual(res, 100d); // 检查结果是否为期望值
        }
        
    }