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