再讲述如何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(); } }