再讲述如何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类的方法
- 第一种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();
}
}
- **第二种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();
}
}