在学习MockUp(API:MockUp)时, MockUp可以自定义方法体,覆盖类原有的方法。 JMockit给我们提供了一个特别的方法,用于拦截所有方法,可以让我们在基于被Mock的方法做AOP。 比如我们想测试每个方法的时间性能。


//通过在mock时做AOP测试方法的时间性能
public class MethodCostPerformanceTest {

	// 测试SayHello类每个方法的时间性能
	@Test
	public void testSayHelloCostPerformance() {
		// 把方法的调用时间记录到costMap中。key是方法名称,value是平均调用时间
		Map<String, Long> costMap = new HashMap<String, Long>();
		new MockUp<SayHello>() {
			@Mock
			public Object $advice(Invocation invocation) {
				long a = System.currentTimeMillis();
				Object result = invocation.proceed();
				long cost = System.currentTimeMillis() - a;
				// 把某方法的平均调用时间记录下来
				String methodName = invocation.getInvokedMember().getName();
				Long preCost = costMap.get(methodName);
				if (preCost == null) {
					costMap.put(methodName, cost);
				} else {
					costMap.put(methodName, (preCost + cost) / 2);
				}
				return result;
			}
		};
		SayHello sayHello = new SayHello();
		sayHello.sayHello("david", ISayHello.MALE);
		sayHello.sayHello("lucy", ISayHello.FEMALE);
		for (Iterator<String> iterator = costMap.keySet().iterator(); iterator.hasNext();) {
			String methodName = (String) iterator.next();
			// 期望每个方法的调用时间不超过20ms
			Assert.isTrue(costMap.get(methodName) < 20);
		}
	}

}