1 回答

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個贊
您是否考慮過使用 CGLib + ObjenesisHelper?CGLib 將允許您代理類和接口,而不僅僅是像 那樣的接口java.lang.reflect.Proxy,并且 ObjenesisHelper 將允許您構(gòu)造類的實(shí)例而無需調(diào)用構(gòu)造函數(shù)。請參閱此處的 CGLib 示例和此處的 ObjenesisHelper 示例。
此外,您可以解包InvocationTargetException以確保代理實(shí)例拋出Exception由模擬類定義的預(yù)期。最后, usingregisterStaticCallbacks將確保綁定的方法攔截器存在于所有調(diào)用線程中。
public <T> T createProxy(final Class<? extends T> classToMock, final T mock) {
final MethodInterceptor interceptor = (object, method, args, proxy) -> {
synchronized (mock) {
try {
return method.invoke(mock, args);
} catch (final InvocationTargetException e) {
if (e.getCause() != null) {
throw e.getCause();
}
throw e;
}
}
};
final Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(classToMock);
final Set<Class<?>> interfaces = new LinkedHashSet<>();
if (classToMock.isInterface()) {
interfaces.add(classToMock);
}
interfaces.addAll(Arrays.asList(classToMock.getInterfaces()));
interfaces.add(CaptureControl.class);
enhancer.setInterfaces(interfaces.toArray(new Class[interfaces.size()]));
enhancer.setCallbackType(interceptor.getClass());
final Class<?> proxyClass = enhancer.createClass();
Enhancer.registerStaticCallbacks(proxyClass, new Callback[] { interceptor });
return (T) ObjenesisHelper.newInstance(proxyClass);
}
使用上述方法時,我遇到任何死鎖的機(jī)會有多大?
我不相信您提供的解決方案,也不相信上面建議的解決方案會遇到任何死鎖(假設(shè)您的代碼中沒有死鎖)。使用synchronizedwill 確保在任何給定時間只有一個線程可以操作模擬實(shí)例..并且除非 jmock 將方法調(diào)用委托給一個單獨(dú)的線程(據(jù)我所知它沒有),那么代碼應(yīng)該正常執(zhí)行而不是阻塞。如果 jmock 要求您Mockery一次鎖定所有實(shí)例,那么您可以傳入一個專用對象進(jìn)行同步,或者為所有代理攔截器提供可重入鎖以共享。
添加回答
舉報