JMockit高级用法 -Mock泛型(类型变量)
在JMockit基础知识中,我们学过可以用@Capturing用于对某个类或接口未来的实例进行Mock。
这里也可以利用MockUp的泛型(类型变量)Mock功能,一样可以达到某个类或接口未来的实例进行Mock的效果。只不过,我们可以享受
在MockUp中手工写Mock方法更直接的Mock方式。
以如何Mock接口中的AnOrdinaryInterface为例:
//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也是一样的效果
@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);
}
}