再讲述如何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类的方法
用Expectations来Mock。
//用Expectations来mock类
public class ClassMockingByExpectationsTest {
@Test
public void testClassMockingByExpectation() {
AnOrdinaryClass instanceToRecord = new AnOrdinaryClass();
new Expectations(AnOrdinaryClass.class) {
{
// mock静态方法
AnOrdinaryClass.staticMethod();
result = 10;
// mock普通方法
instanceToRecord.ordinaryMethod();
result = 20;
// mock final方法
instanceToRecord.finalMethod();
result = 30;
// native, private方法无法用Expectations来Mock
}
};
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();
}
}
2.用MockUp来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();
}
}