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.
Hola, tuve el mismo problema y encontré este artículo realmente útil.
http://corner.squareup.com/2012/10/mockito-android.html
La pieza clave de información es:
Para usar Mockito en un dispositivo o emulador, deberá agregar tres archivos .jar al directorio libs del proyecto de prueba: mockito-all-1.9.5.jar , dexmaker-1.0.jar y dexmaker-mockito-1.0.jar .
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''