在Mock类的章节中,我们知道了如何用Expectations来Mock类。Mock实例的用法基本一样。只需要把Expectations的构造函数参数换成实例即可。

用Expectations来Mock类与用Expectations来Mock实例的唯一不同就在于,前者影响类的所有实例,而后者只影响某一个实例。

//mock实例
public class InstanceMockingByExpectationsTest {
	@Test
	public void testInstanceMockingByExpectation() {
		AnOrdinaryClass instance = new AnOrdinaryClass();
		// 直接把实例传给Expectations的构造函数即可Mock这个实例
		new Expectations(instance) {
			{
				// 尽管这里也可以Mock静态方法,但不推荐在这里写。静态方法的Mock应该是针对类的
				// mock普通方法
				instance.ordinaryMethod();
				result = 20;
				// mock final方法
				instance.finalMethod();
				result = 30;
				// native, private方法无法用Expectations来Mock
			}
		};
		Assert.assertTrue(AnOrdinaryClass.staticMethod() == 1);
		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();    
	}    
}