(二)普通类的Mock--实战篇

再讲述如何Mock类之前,我们先给出一个普通的类,这个类有static,final,native,private方法。以及一个非static/final/native/private的普通public 方法。

//一个普通类 
public class AnOrdinaryClass {
 
    // 静态方法
    public static int staticMethod() {
        return 1;
    }
 
    // 普通方法
    public int ordinaryMethod() {
        return 2;
    }
 
    // final方法
    public final int finalMethod() {
        return 3;
    }
 
    // native方法,返回4
    public native int navtiveMethod();
 
    // private方法
    private int privateMethod() {
        return 5;
    }
 
    // 内部调用private方法
    public int callPrivateMethod() {
        return privateMethod();
    }
}

下面,讲述2种Mock类的方法

  1. 第一种Mock方法:用Expectations来mock类
import mockit.Expectations;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;

//第一种mock方法:用Expectations来mock类
//注意: native, private方法无法用Expectations来Mock

public class ClassMockingByExpectationsTest {
    @Test
    public void testClassMockingToRecord(){
        AnOrdinaryClass instanceToRecord  = new AnOrdinaryClass();
        new Expectations(AnOrdinaryClass.class){
            {
                //mock 静态方法
                AnOrdinaryClass.staticMethod();
                result = 10;

                //mock 普通方法
                instanceToRecord.ordinaryMethod();
                result = 20;

                //mock final 方法
                instanceToRecord.finalMethod();
                result = 30;
            }
        };
        AnOrdinaryClass instance = new AnOrdinaryClass();
        Assert.assertTrue(AnOrdinaryClass.staticMethod() == 10);
        Assert.assertTrue(instance.ordinaryMethod() == 20);
        Assert.assertTrue(instance.finalMethod() == 30);

        // 用Expectations无法mock native方法
        Assert.assertTrue(instance.navtiveMethod() == 4);
        
        // 用Expectations无法mock private方法
        Assert.assertTrue(instance.callPrivateMethod() == 5);
        }
        @BeforeClass
    //加载AnOrdinaryClass类的native方法的native实现
    public static void loadNative()throws Throwable{
        JNITools.loadNative();
        }
}

  1. **第二种mock方法:**用MockUp来Mock类
//第二种mock方法:用MockUp来mock类
public class ClassMockingByMockUpTest {
    // AnOrdinaryClass的MockUp类,继承MockUp即可
    public static class AnOrdinaryClassMockUp extends MockUp<AnOrdinaryClass> {
        // Mock静态方法
        @Mock
        public static int staticMethod() {
            return 10;
        }
 
        // Mock普通方法
        @Mock
        public int ordinaryMethod() {
            return 20;
        }
 
        @Mock
        // Mock final方法
        public final int finalMethod() {
            return 30;
        }
 
        // Mock native方法
        @Mock
        public int navtiveMethod() {
            return 40;
        }
 
        // Mock private方法
        @Mock
        private int privateMethod() {
            return 50;
        }
    }
 
    @Test
    public void testClassMockingByMockUp() {
        new AnOrdinaryClassMockUp();
        AnOrdinaryClass instance = new AnOrdinaryClass();
        // 静态方法被mock了
        Assert.assertTrue(AnOrdinaryClass.staticMethod() == 10);
        // 普通方法被mock了
        Assert.assertTrue(instance.ordinaryMethod() == 20);
        // final方法被mock了
        Assert.assertTrue(instance.finalMethod() == 30);
        // native方法被mock了
        Assert.assertTrue(instance.navtiveMethod() == 40);
        // private方法被mock了
        Assert.assertTrue(instance.callPrivateMethod() == 50);
    }
 
    @BeforeClass    
    // 加载AnOrdinaryClass类的native方法的native实现    
    public static void loadNative() throws Throwable {    
        JNITools.loadNative();    
    }    
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值