在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);
	}
}