在JMockit基础知识中,我们学过可以用@Capturing用于对某个类或接口未来的实例进行Mock。
这里也可以利用MockUp的泛型(类型变量)Mock功能,一样可以达到某个类或接口未来的实例进行Mock的效果。只不过,我们可以享受
在MockUp中手工写Mock方法更直接的Mock方式。
以如何Mock接口中的AnOrdinaryInterface为例:
- 第一种方法:Mock泛型
import mockit.Capturing;
import mockit.Expectations;
import mockit.Mock;
import mockit.MockUp;
import org.junit.Assert;
import org.junit.Test;
//第一种方法:Mock 泛型
public class GenericMockUpTest {
@Test
public <T extends AnOrdinaryInterface> void testMockUp(){
//通过传给MockUp一个泛型类型变量,MockUp可以对这个类型变量的上限进行mock,
// 以后所有这个上限的方法调用,就会走Mock后逻辑
new MockUp<T>(){
@Mock
public int method1(){
return 10;
}
@Mock
public int method2(){
return 20;
}
};
//自定义一个AnordinaryInterface 的实现
AnOrdinaryInterface instance1 = new AnOrdinaryInterface() {
@Override
public int method1() {
return 1;
}
@Override
public int method2() {
return 1;
}
};
// 再定义一个AnOrdinaryInterface的实现
AnOrdinaryInterface instance2 = new AnOrdinaryInterface() {
@Override
public int method1() {
return 2;
}
@Override
public int method2() {
return 2;
}
};
//发现自定义的实现没有被作用,而是被Mock逻辑替代了
Assert.assertTrue(instance1.method1() == 10);
Assert.assertTrue(instance2.method1() == 10);
Assert.assertTrue(instance1.method2() == 20);
Assert.assertTrue(instance2.method2() == 20);
}
}
- 第二种方法:用@capturing实现mock泛型
import mockit.Capturing;
import mockit.Expectations;
import mockit.Mock;
import mockit.MockUp;
import org.junit.Assert;
import org.junit.Test;
//第二种方法:其实用@capturing也是一样的效果
public class GenericMockUpTest {
@Test
public <T extends AnOrdinaryInterface> void sameEffect(@Capturing AnOrdinaryInterface instance){
new Expectations(){
{
instance.method1();
result = 10;
instance.method2();
result = 20;
}
};
//自定义一个AnOrdinaryInterface的实现
AnOrdinaryInterface instance1 = new AnOrdinaryInterface() {
@Override
public int method1() {
return 1;
}
@Override
public int method2() {
return 1;
}
};
//再定义一个AnOrdinaryInterface的实现
AnOrdinaryInterface instance2 = new AnOrdinaryInterface() {
@Override
public int method1() {
return 2;
}
@Override
public int method2() {
return 2;
}
};
//发现自定义的实现没有被作用,而是被Mock逻辑替代了
Assert.assertTrue(instance1.method1() == 10);
Assert.assertTrue(instance2.method1() == 10);
Assert.assertTrue(instance1.method2() == 20);
Assert.assertTrue(instance2.method2() == 20);
}
}