Pass abstract class metadata interface ClassInfo, not CtClass, to Setup.
diff --git a/src/main/java/org/robolectric/bytecode/AndroidTranslator.java b/src/main/java/org/robolectric/bytecode/AndroidTranslator.java
index 0cfae44..a3674e8 100644
--- a/src/main/java/org/robolectric/bytecode/AndroidTranslator.java
+++ b/src/main/java/org/robolectric/bytecode/AndroidTranslator.java
@@ -5,6 +5,7 @@
import javassist.Modifier;
import java.io.IOException;
+import java.lang.annotation.Annotation;
import java.lang.reflect.*;
@SuppressWarnings({"UnusedDeclaration"})
@@ -71,7 +72,7 @@
throw new IgnorableClassNotFoundException(e);
}
- boolean shouldInstrument = setup.shouldInstrument(ctClass);
+ boolean shouldInstrument = setup.shouldInstrument(new JavassistClassInfo(ctClass));
if (debug)
System.out.println("Considering " + ctClass.getName() + ": " + (shouldInstrument ? "INSTRUMENTING" : "not instrumenting"));
@@ -135,6 +136,34 @@
ctClass.replaceClassName(map);
}
+ static class JavassistClassInfo implements ClassInfo {
+ private final CtClass ctClass;
+
+ public JavassistClassInfo(CtClass ctClass) {
+ this.ctClass = ctClass;
+ }
+
+ @Override
+ public String getName() {
+ return ctClass.getName();
+ }
+
+ @Override
+ public boolean isInterface() {
+ return ctClass.isInterface();
+ }
+
+ @Override
+ public boolean isAnnotation() {
+ return ctClass.isAnnotation();
+ }
+
+ @Override
+ public boolean hasAnnotation(Class<? extends Annotation> annotationClass) {
+ return ctClass.hasAnnotation(annotationClass);
+ }
+ }
+
class FromAndroidClassNameParts {
private static final String TOKEN = "__FromAndroid";
diff --git a/src/main/java/org/robolectric/bytecode/ClassInfo.java b/src/main/java/org/robolectric/bytecode/ClassInfo.java
new file mode 100644
index 0000000..d981dcc
--- /dev/null
+++ b/src/main/java/org/robolectric/bytecode/ClassInfo.java
@@ -0,0 +1,13 @@
+package org.robolectric.bytecode;
+
+import java.lang.annotation.Annotation;
+
+public interface ClassInfo {
+ String getName();
+
+ boolean isInterface();
+
+ boolean isAnnotation();
+
+ boolean hasAnnotation(Class<? extends Annotation> annotationClass);
+}
diff --git a/src/main/java/org/robolectric/bytecode/Setup.java b/src/main/java/org/robolectric/bytecode/Setup.java
index 22ef845..2a43f2d 100644
--- a/src/main/java/org/robolectric/bytecode/Setup.java
+++ b/src/main/java/org/robolectric/bytecode/Setup.java
@@ -14,9 +14,11 @@
import org.robolectric.res.ResourcePath;
import org.robolectric.util.DatabaseConfig;
import org.robolectric.util.I18nException;
-import javassist.CtClass;
-import java.util.*;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
import static java.util.Arrays.asList;
@@ -53,12 +55,12 @@
return !isFromAndroidSdk(clazz);
}
- public boolean shouldInstrument(CtClass ctClass) {
- if (ctClass.isInterface() || ctClass.isAnnotation() || ctClass.hasAnnotation(DoNotInstrument.class)) {
+ public boolean shouldInstrument(ClassInfo classInfo) {
+ if (classInfo.isInterface() || classInfo.isAnnotation() || classInfo.hasAnnotation(DoNotInstrument.class)) {
return false;
}
- if (isFromAndroidSdk(ctClass)) {
+ if (isFromAndroidSdk(classInfo)) {
return true;
}
@@ -66,10 +68,9 @@
}
- public boolean isFromAndroidSdk(CtClass ctClass) {
+ public boolean isFromAndroidSdk(ClassInfo classInfo) {
// allow explicit control with @Instrument, mostly for tests
- return ctClass.hasAnnotation(Instrument.class) || isFromAndroidSdk(ctClass.getName());
-
+ return classInfo.hasAnnotation(Instrument.class) || isFromAndroidSdk(classInfo.getName());
}
public boolean isFromAndroidSdk(Class clazz) {
diff --git a/src/test/java/org/robolectric/TestRunners.java b/src/test/java/org/robolectric/TestRunners.java
index 43cad35..889887a 100644
--- a/src/test/java/org/robolectric/TestRunners.java
+++ b/src/test/java/org/robolectric/TestRunners.java
@@ -1,9 +1,9 @@
package org.robolectric;
-import org.robolectric.bytecode.AndroidTranslatorClassInstrumentedTest;
-import org.robolectric.bytecode.Setup;
-import javassist.CtClass;
import org.junit.runners.model.InitializationError;
+import org.robolectric.bytecode.AndroidTranslatorClassInstrumentedTest;
+import org.robolectric.bytecode.ClassInfo;
+import org.robolectric.bytecode.Setup;
import java.lang.reflect.Method;
@@ -25,13 +25,13 @@
public Setup createSetup() {
return new Setup() {
@Override
- public boolean shouldInstrument(CtClass ctClass) {
- String name = ctClass.getName();
+ public boolean shouldInstrument(ClassInfo classInfo) {
+ String name = classInfo.getName();
if (name.equals(AndroidTranslatorClassInstrumentedTest.CustomPaint.class.getName())
|| name.equals(AndroidTranslatorClassInstrumentedTest.ClassWithPrivateConstructor.class.getName())) {
return true;
}
- return super.shouldInstrument(ctClass);
+ return super.shouldInstrument(classInfo);
}
};
}
diff --git a/src/test/java/org/robolectric/bytecode/SetupTest.java b/src/test/java/org/robolectric/bytecode/SetupTest.java
index 1f5ae12..55836d0 100644
--- a/src/test/java/org/robolectric/bytecode/SetupTest.java
+++ b/src/test/java/org/robolectric/bytecode/SetupTest.java
@@ -1,6 +1,7 @@
package org.robolectric.bytecode;
import javassist.ClassPool;
+import javassist.CtClass;
import org.junit.Before;
import org.junit.Test;
@@ -19,24 +20,24 @@
@Test
public void shouldInstrumentDefaultRequestDirector() throws Exception {
- assertTrue(setup.shouldInstrument(classPool.makeClass("org.apache.http.impl.client.DefaultRequestDirector")));
+ assertTrue(setup.shouldInstrument(wrap(classPool.makeClass("org.apache.http.impl.client.DefaultRequestDirector"))));
}
@Test
public void shouldInstrumentGoogleMapsClasses() throws Exception {
- assertTrue(setup.shouldInstrument(classPool.makeClass("com.google.android.maps.SomeMapsClass")));
+ assertTrue(setup.shouldInstrument(wrap(classPool.makeClass("com.google.android.maps.SomeMapsClass"))));
}
@Test
public void shouldNotInstrumentCoreJdkClasses() throws Exception {
- assertFalse(setup.shouldInstrument(classPool.get("java.lang.Object")));
- assertFalse(setup.shouldInstrument(classPool.get("java.lang.String")));
+ assertFalse(setup.shouldInstrument(wrap(classPool.get("java.lang.Object"))));
+ assertFalse(setup.shouldInstrument(wrap(classPool.get("java.lang.String"))));
}
@Test
- public void shouldInstumentAndroidCoreClasses() throws Exception {
- assertTrue(setup.shouldInstrument(classPool.makeClass("android.content.Intent")));
- assertTrue(setup.shouldInstrument(classPool.makeClass("android.and.now.for.something.completely.different")));
+ public void shouldInstrumentAndroidCoreClasses() throws Exception {
+ assertTrue(setup.shouldInstrument(wrap(classPool.makeClass("android.content.Intent"))));
+ assertTrue(setup.shouldInstrument(wrap(classPool.makeClass("android.and.now.for.something.completely.different"))));
}
@Test
@@ -47,4 +48,8 @@
assertFalse(setup.shouldAcquire("com.whatever.R$anything"));
assertTrue(setup.shouldAcquire("com.whatever.R$anything$else"));
}
+
+ ClassInfo wrap(CtClass ctClass) {
+ return new AndroidTranslator.JavassistClassInfo(ctClass);
+ }
}