在讲述如何Mock接口前,我们给出一个普通接口的代码。
//一个普通的接口
public interface AnOrdinaryInterface {
// 方法1
public int method1();
// 方法2
public int method2();
}
如下给出2种Mock接口的方法:
- 第一种方法:用Expectations 来Mock
import mockit.Expectations;
import mockit.Injectable;
import org.junit.Assert;
import org.junit.Test;
//用Expectations来mock接口
public class InterfaceMockingByExpectationsTest {
//通过@Injectable,让JMockit帮我们生成这个接口的实例,
// 一般来说,接口是给类来依赖的,我们给待测试的类加上@Tested,就可以让JMockit做依赖注入。详细见JMockit基础的章节
// @Injectable只是针对其修饰的实例,而@Mocked是针对其修饰类的所有实例。
// @Injectable对类的静态方法,构造函数没有影响。因为它只影响某一个实例嘛!
@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);
}
}
- 第二种方法:用MockUp来Mock
import mockit.Mock;
import org.junit.Assert;
import org.junit.Test;
//用MockUp来mock接口
public class InterfaceMockingByMockUpTest {
@Test
public void testfaceMockingByMockUpTest(){
//手工通过MockUp创建这个接口的实例
AnOrdinaryInterface anOrdinaryInterface = new Mock<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.method1() == 20);
}
}
显然, 在Mock接口时,使用@Injectable注解API,比使用MockUp更方便。单纯通过MockUp生成接口的某个Mock实例,在实际的测试场景中并没有多大用途,接口就是用来给类依赖的,我们要充分利用JMockit的依赖注入功能。