在讲述如何Mock接口前,我们给出一个普通接口的代码。

//一个普通的接口
public interface AnOrdinaryInterface {
	// 方法1
	public int method1();

	// 方法2
	public int method2();
}


我们依然给出2种Mock接口的2种方法。


  1. 用Expectations来Mock

  2. //用Expectations来mock接口
    public class InterfaceMockingByExpectationsTest {
    
    	// 通过@Injectable,让JMockit帮我们生成这个接口的实例,
    	// 一般来说,接口是给类来依赖的,我们给待测试的类加上@Tested,就可以让JMockit做依赖注入。详细见JMockit基础的章节
    	@Injectable
    	AnOrdinaryInterface anOrdinaryInterface;
    
    	@Test
    	public void testInterfaceMockingByExpectation() {
    		// 录制
    		new Expectations() {
    			{
    				anOrdinaryInterface.method1();
    				result = 10;
    				anOrdinaryInterface.method2();
    				result = 20;
    			}
    		};
    		Assert.assertTrue(anOrdinaryInterface.method1() == 10);
    		Assert.assertTrue(anOrdinaryInterface.method2() == 20);
    	}
    }
  3. 用MockUp来Mock

  4. //用MockUp来mock接口
    public class InterfaceMockingByMockUpTest {
    
    	@Test
    	public void testInterfaceMockingByMockUp() {
    		// 手工通过MockUp创建这个接口的实例
    		AnOrdinaryInterface anOrdinaryInterface = new MockUp<AnOrdinaryInterface>(AnOrdinaryInterface.class) {
    			// 对方法Mock
    			@Mock
    			public int method1() {
    				return 10;
    			}
    
    			@Mock
    			public int method2() {
    				return 20;
    			}
    		}.getMockInstance();
    
    		Assert.assertTrue(anOrdinaryInterface.method1() == 10);
    		Assert.assertTrue(anOrdinaryInterface.method2() == 20);
    	}
    }

显然, 在Mock接口时,使用@Injectable注解API,比使用MockUp更方便。单纯通过MockUp生成接口的某个Mock实例,在实际的测试场景中并没有多大用途,接口就是用来给类依赖的,我们要充分利用JMockit的依赖注入功能。