| --- a/./android/tests/gen_for_adt/org/mozc/android/inputmethod/japanese/testing/mocking/MockMethodInterceptor.java |
| +++ b/./android/tests/gen_for_adt/org/mozc/android/inputmethod/japanese/testing/mocking/MockMethodInterceptor.java |
| @@ -13,7 +13,9 @@ |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| -package org.easymock.internal; |
| +package org.mozc.android.inputmethod.japanese.testing.mocking; |
| + |
| +import com.google.dexmaker.stock.ProxyBuilder; |
| |
| import java.io.IOException; |
| import java.io.Serializable; |
| @@ -24,10 +26,8 @@ |
| import java.util.List; |
| import java.util.Set; |
| |
| -import net.sf.cglib.core.*; |
| -import net.sf.cglib.proxy.*; |
| - |
| import org.easymock.ConstructorArgs; |
| +import org.easymock.internal.BridgeMethodResolver; |
| |
| /** |
| * Factory generating a mock for a class. |
| @@ -37,11 +37,7 @@ |
| * |
| * @author Henri Tremblay |
| */ |
| -public class ClassProxyFactory<T> implements IProxyFactory<T> { |
| - |
| - public static class MockMethodInterceptor implements MethodInterceptor, Serializable { |
| - |
| - private static final long serialVersionUID = -9054190871232972342L; |
| + public class MockMethodInterceptor implements InvocationHandler { |
| |
| private final InvocationHandler handler; |
| |
| @@ -51,7 +47,8 @@ |
| this.handler = handler; |
| } |
| |
| - public Object intercept(final Object obj, Method method, final Object[] args, final MethodProxy proxy) |
| + @Override |
| + public Object invoke(final Object obj, Method method, final Object[] args) |
| throws Throwable { |
| |
| // We conveniently mock abstract methods be default |
| @@ -70,7 +67,7 @@ |
| final StackTraceElement element = elements[2]; |
| if (element.getClassName().equals("org.easymock.internal.MockInvocationHandler") |
| && element.getMethodName().equals("invoke")) { |
| - return proxy.invokeSuper(obj, args); |
| + return ProxyBuilder.callSuper(obj, method, args); |
| } |
| } |
| } |
| @@ -88,7 +85,7 @@ |
| } |
| |
| if (mockedMethods != null && !mockedMethods.contains(method)) { |
| - return proxy.invokeSuper(obj, args); |
| + return ProxyBuilder.callSuper(obj, method, args); |
| } |
| |
| return handler.invoke(obj, method, args); |
| @@ -101,171 +98,4 @@ |
| public void setMockedMethods(final Method... mockedMethods) { |
| this.mockedMethods = new HashSet<Method>(Arrays.asList(mockedMethods)); |
| } |
| - |
| - @SuppressWarnings("unchecked") |
| - private void readObject(final java.io.ObjectInputStream stream) throws IOException, |
| - ClassNotFoundException { |
| - stream.defaultReadObject(); |
| - final Set<MethodSerializationWrapper> methods = (Set<MethodSerializationWrapper>) stream |
| - .readObject(); |
| - if (methods == null) { |
| - return; |
| - } |
| - |
| - mockedMethods = new HashSet<Method>(methods.size()); |
| - for (final MethodSerializationWrapper m : methods) { |
| - try { |
| - mockedMethods.add(m.getMethod()); |
| - } catch (final NoSuchMethodException e) { |
| - // ///CLOVER:OFF |
| - throw new IOException(e.toString()); |
| - // ///CLOVER:ON |
| - } |
| - } |
| - } |
| - |
| - private void writeObject(final java.io.ObjectOutputStream stream) throws IOException { |
| - stream.defaultWriteObject(); |
| - |
| - if (mockedMethods == null) { |
| - stream.writeObject(null); |
| - return; |
| - } |
| - |
| - final Set<MethodSerializationWrapper> methods = new HashSet<MethodSerializationWrapper>( |
| - mockedMethods.size()); |
| - for (final Method m : mockedMethods) { |
| - methods.add(new MethodSerializationWrapper(m)); |
| - } |
| - |
| - stream.writeObject(methods); |
| - } |
| - } |
| - |
| - // ///CLOVER:OFF (I don't know how to test it automatically yet) |
| - private static final NamingPolicy ALLOWS_MOCKING_CLASSES_IN_SIGNED_PACKAGES = new DefaultNamingPolicy() { |
| - @Override |
| - public String getClassName(final String prefix, final String source, final Object key, |
| - final Predicate names) { |
| - return "codegen." + super.getClassName(prefix, source, key, names); |
| - } |
| - }; |
| - |
| - // ///CLOVER:ON |
| - |
| - @SuppressWarnings("unchecked") |
| - public T createProxy(final Class<T> toMock, final InvocationHandler handler) { |
| - |
| - final Enhancer enhancer = createEnhancer(toMock); |
| - |
| - final MethodInterceptor interceptor = new MockMethodInterceptor(handler); |
| - enhancer.setCallbackType(interceptor.getClass()); |
| - |
| - Class mockClass; |
| - try { |
| - mockClass = enhancer.createClass(); |
| - } catch (final CodeGenerationException e) { |
| - // ///CLOVER:OFF (don't know how to test it automatically) |
| - // Probably caused by a NoClassDefFoundError, let's try EasyMock class loader |
| - // instead of the default one (which is the class to mock one |
| - // This is required by Eclipse Plug-ins, the mock class loader doesn't see |
| - // cglib most of the time. Using EasyMock class loader solves this |
| - // See issue ID: 2994002 |
| - enhancer.setClassLoader(getClass().getClassLoader()); |
| - mockClass = enhancer.createClass(); |
| - // ///CLOVER:ON |
| - } |
| - |
| - try { |
| - Enhancer.registerCallbacks(mockClass, new Callback[] { interceptor }); |
| - |
| - if (ClassExtensionHelper.getCurrentConstructorArgs() != null) { |
| - // Really instantiate the class |
| - final ConstructorArgs args = ClassExtensionHelper.getCurrentConstructorArgs(); |
| - Constructor cstr; |
| - try { |
| - // Get the constructor with the same params |
| - cstr = mockClass.getDeclaredConstructor(args.getConstructor().getParameterTypes()); |
| - } catch (final NoSuchMethodException e) { |
| - // Shouldn't happen, constructor is checked when ConstructorArgs is instantiated |
| - // ///CLOVER:OFF |
| - throw new RuntimeException("Fail to find constructor for param types", e); |
| - // ///CLOVER:ON |
| - } |
| - T mock; |
| - try { |
| - cstr.setAccessible(true); // So we can call a protected |
| - // constructor |
| - mock = (T) cstr.newInstance(args.getInitArgs()); |
| - } catch (final InstantiationException e) { |
| - // ///CLOVER:OFF |
| - throw new RuntimeException("Failed to instantiate mock calling constructor", e); |
| - // ///CLOVER:ON |
| - } catch (final IllegalAccessException e) { |
| - // ///CLOVER:OFF |
| - throw new RuntimeException("Failed to instantiate mock calling constructor", e); |
| - // ///CLOVER:ON |
| - } catch (final InvocationTargetException e) { |
| - throw new RuntimeException( |
| - "Failed to instantiate mock calling constructor: Exception in constructor", e |
| - .getTargetException()); |
| - } |
| - return mock; |
| - } else { |
| - // Do not call any constructor |
| - |
| - Factory mock; |
| - try { |
| - mock = (Factory) ClassInstantiatorFactory.getInstantiator().newInstance(mockClass); |
| - } catch (final InstantiationException e) { |
| - // ///CLOVER:OFF |
| - throw new RuntimeException("Fail to instantiate mock for " + toMock + " on " |
| - + ClassInstantiatorFactory.getJVM() + " JVM"); |
| - // ///CLOVER:ON |
| - } |
| - |
| - // This call is required. CGlib has some "magic code" making sure a |
| - // callback is used by only one instance of a given class. So only |
| - // the |
| - // instance created right after registering the callback will get |
| - // it. |
| - // However, this is done in the constructor which I'm bypassing to |
| - // allow class instantiation without calling a constructor. |
| - // Fortunately, the "magic code" is also called in getCallback which |
| - // is |
| - // why I'm calling it here mock.getCallback(0); |
| - mock.getCallback(0); |
| - |
| - return (T) mock; |
| - } |
| - } finally { |
| - // To avoid CGLib out of memory issues |
| - Enhancer.registerCallbacks(mockClass, null); |
| - } |
| - } |
| - |
| - private Enhancer createEnhancer(final Class<T> toMock) { |
| - // Create the mock |
| - final Enhancer enhancer = new Enhancer() { |
| - /** |
| - * Filter all private constructors but do not check that there are |
| - * some left |
| - */ |
| - @SuppressWarnings("unchecked") |
| - @Override |
| - protected void filterConstructors(final Class sc, final List constructors) { |
| - CollectionUtils.filter(constructors, new VisibilityPredicate(sc, true)); |
| - } |
| - }; |
| - enhancer.setSuperclass(toMock); |
| - |
| - // ///CLOVER:OFF (I don't know how to test it automatically yet) |
| - // See issue ID: 2994002 |
| - if (toMock.getSigners() != null) { |
| - enhancer.setNamingPolicy(ALLOWS_MOCKING_CLASSES_IN_SIGNED_PACKAGES); |
| - } |
| - // ///CLOVER:ON |
| - |
| - return enhancer; |
| } |
| -} |