blob: 85fa5d4eaf213d3270de7677c103e2595c5ae408 [file] [log] [blame]
--- 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;
}
-}