android junit mockito cglib dexmaker

android - VerifyError utilizando Mockito 1.9.5 y DexMaker-Mockito-1.0



junit cglib (5)

Acabamos de tener el mismo problema en un proyecto, pero nuestras pruebas también fallaron en un dispositivo real.

La causa fue rastreada a cómo Mockito usa el cargador de clases, y resultó en el siguiente error en LogCat:

W/ActivityThread(5777): ClassLoader.getResources: The class loader returned by Thread.getContextClassLoader() may fail for processes that host multiple applications. You should explicitly specify a context class loader. For example: Thread.setContextClassLoader(getClass().getClassLoader());

La solución fue establecer explícitamente el cargador de clases antes de llamar a mock () a prueba, por ejemplo.

@Override protected void setUp() throws Exception { super.setUp(); Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); fooImpl = mock(Foo.class) }

El archivo problemático en Mockito es este: org.mockito.internal.configuration.ClassPathLoader (línea 121 en 1.9.5)

Como muchos otros, me entusiasmó escuchar que Mockito ahora funciona con Android y seguí este tutorial para verlo con mis propios ojos. Todo me pareció fantástico y empecé a incorporar la solución de burla en mi proyecto de prueba de Android ...

El error

Sin embargo, al configurar el proyecto de prueba de mi aplicación para aprovechar los mockito-all-1.9.5 , dexmaker-1.0 y dexmaker-mockito-1.0 encontré un problema con mi primer caso de prueba. Precisamente este problema de hecho. La parte en la que me gustaría recibir ayuda es;

Caused by: java.lang.VerifyError: org/mockito/cglib/core/ReflectUtils at org.mockito.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:167) at org.mockito.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) at org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217) at org.mockito.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145) at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:117) at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:109) at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:105) at org.mockito.cglib.proxy.Enhancer.<clinit>(Enhancer.java:70)

Se me ha informado que este "simplemente no funciona del todo" ya que el seguimiento de la pila implica que el contenedor DexMaker no se está utilizando. Consulte esta respuesta . Sin embargo, sospecho que estoy haciendo algo mal con respecto a la configuración de mi proyecto, por lo que busco aprovechar la base de conocimientos colectivos para ver si es un error del usuario o un error beta.

Configuración de mi proyecto de prueba de Android

A continuación encontrará una captura de pantalla de la configuración de mi proyecto de prueba. El proyecto se creó a través del Asistente de Android y no comparte características especiales aparte de la inclusión de los archivos Mockito y DexMaker (mencionados anteriormente) en el directorio libs .

La prueba

No importa el contenido de la prueba (la prueba falla antes de que se ejecute la prueba de la unidad) la configuración es como se describe a continuación;

public class TestSpotRatingCalculator extends InstrumentationTestCase { @Mock private AService aService; // Changed the service names being used here - not important. @Mock private BService bService; @Mock private CService cService; @Mock private DService dService; /** * @see android.test.AndroidTestCase#setUp() */ @Override protected void setUp() throws Exception { super.setUp(); MockitoAnnotations.initMocks(this); // Failure here with aforementioned stacktrace... }

Si alguien por ahí tiene una idea de lo que está mal, por favor, póngase en contacto aquí.


Como se indicó here el combo dexmaker-android solo funciona al 100% cuando las pruebas instrumentadas se ejecutan en un dispositivo real .

La ejecución de las pruebas en un dispositivo real no presenta este error.



Para todos los que aún tienen este error, verifique si no excluyó una clase en las dependencias. Excluimos por accidente la clase MockMaker, por lo que esta fue la causa de la excepción.


Solo agrega esto en tu gradle:

androidTestCompile ''org.mockito:mockito-core:1.10.8'' androidTestCompile ''com.google.dexmaker:dexmaker-mockito:1.1''