Mockito + Dexmaker en Android
Estoy tratando de usar Mockito en mi proyecto de Android. He encontrado tutorial muy agradable que trata con él: http://www.paulbutcher.com/2012/05/mockito-on-android-step-by-step/
Básicamente utiliza la nueva versión de Mockito + Dexmaker y todo funciona como se esperaba.
Sin embargo, cuando trato de burlarse de algún objeto específico de Android es decir:
- Pruebas de instrumentación Android con Mockito
- Error de tiempo de ejecución PowerMock + Mockito: ProxyFrameworkImpl no se pudo encontrar en classpath
- ¿Cómo probar correctamente ORM en android usando Mockito?
- Mocking SQLite-Database durante la prueba de actividad con Robolectric
- Cómo burlar los permisos para realizar pruebas en Android?
Context context = mock(Context.class);
Recibo esta excepción:
java.lang.IllegalArgumentException: dexcache == null (and no default could be found; consider setting the 'dexmaker.dexcache' system property) at com.google.dexmaker.DexMaker.generateAndLoad(DexMaker.java:359) at com.google.dexmaker.stock.ProxyBuilder.buildProxyClass(ProxyBuilder.java:252) at com.google.dexmaker.mockito.DexmakerMockMaker.createMock(DexmakerMockMaker.java:54) at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26)
¿Alguna de idea de cómo arreglarlo?
- Problema de configuración de mockito con eclipse. Da error: java.lang.verifyError
- ¿Cómo puedo obtener Mockito trabajando en androidTest
- Unidad que prueba una respuesta de red. Funciona al depurar, no cuando se ejecuta realmente
- Robolectric Test no llama a textWatcher.onTextChanged
- Siempre obtener el error de hilo incluso si la prueba de unidad pasa en Android usando Mockito
- ¿Por qué ArgumentCaptor no coincide correctamente?
- Android Tests: Stubbing Out Retrofit con Mockito
- Junit / Mockito - esperar la ejecución del método
De comentario @ rjath @ MrChaz de la respuesta, esto funciona mejor para mí:
System.setProperty( "dexmaker.dexcache", getInstrumentation().getTargetContext().getCacheDir().getPath());
Lo puse en mi método setUp()
.
He conseguido reconstruir una solución que parece estar funcionando para mí. Al manifiesto agregué el almacenaje externo de la lectura y de la escritura. A la prueba he añadido System.setProperty("dexmaker.dexcache", "/sdcard");
A la prueba. A la imagen del emulador agregué una tarjeta SD.
Creo que esto funciona porque por defecto mockito intenta utilizar el directorio de caché de aplicaciones pero nunca ejecuto una actividad así que sospecho que el directorio nunca es creado por el sistema operativo
Por lo tanto, el problema es que Dexmaker no pueda encontrar la ruta de caché en Android> = 4.3 como otras personas mencionadas y como se describe en esta edición dexmaker .
Fui con la implementación de la solución en un corredor de prueba personalizado instrumentado en lugar de en cada prueba (o su superclase) setUp()
, porque se siente un poco menos hacky (que realmente es en un solo lugar – y no heredado en cada subclase) y mas flexible. Por razones de documentación, estos son los cambios necesarios para hacer esto:
public class CustomInstrumentationTestRunner extends InstrumentationTestRunner { @Override public void onCreate (final Bundle arguments) { super.onCreate(arguments); // temporary workaround for an incompatibility in current dexmaker (1.1) implementation and Android >= 4.3 // cf. https://code.google.com/p/dexmaker/issues/detail?id=2 for details System.setProperty("dexmaker.dexcache", getTargetContext().getCacheDir().toString()); } }
Y configurar su proyecto (o proyecto de prueba) para utilizar esta clase como el corredor de prueba instrumentado en su AndroidManifest.xml
al construir con ant:
<instrumentation android:name="my.package.CustomInstrumentationTestRunner" android:targetPackage="my.target.package" />
O su build.gradle
al construir con gradle:
android { defaultConfig { // ... testInstrumentationRunner 'my.package.CustomInstrumentationTestRunner' } // ... }
Si tiene otras entradas de instrumentation
, puede cambiar entre ellas, ya sea en la línea de comandos o seleccionar una en la configuración en ejecución de IDE.
¡Tengo este problema para un proyecto de la Biblioteca de Android pero NO para el proyecto de aplicación! Establecer la propiedad System "dexmaker.dexcache" como se mencionó anteriormente funcionó alrededor del problema. Estoy funcionando con Android 4.3 Nexus 4 dispositivo, construyendo con 19.0.3 herramientas, Api objetivo 19, mis dependencias:
androidTestCompile "org.mockito:mockito-core:1.9.5" androidTestCompile "com.google.dexmaker:dexmaker:1.0" androidTestCompile "com.google.dexmaker:dexmaker-mockito:1.0"
Parece que el proyecto dexmaker se ha movido de Google Code a GitHub .
En el repositorio central de maven hay versiones 1.1 y 1.2 publicadas en marzo de 2014 y diciembre de 2014.
He verificado que este problema "dexcache == null" todavía existe a través de la versión 1.2, pero sólo en ciertos dispositivos. Por ejemplo, un Galaxy S5 con Android 5.0 tiene el problema, y un Galaxy S4 con Android 4.4.2 no.
Cloné el repositorio de GitHub ( último commit el 12 de marzo de 2015 – ca74669 ), y corrió localmente, y el problema se ha solucionado (también hay compromisos en la historia que respaldan esto). Así que una vez hay una versión 1.3, esperemos que este problema se ha ido para siempre!
Cualquier otra persona que quiera ejecutar una copia local de 1.3-SNAPSHOT, aquí es cómo lo hice (en una Mac, pero otras plataformas deberían funcionar también, necesitará mvn , adb y dx en PATH ):
-
git clone
https://github.com/crittercism/dexmaker.git -
cd dexmaker
-
mvn install -Dmaven.test.skip=true
-
cp -R ~/.m2/repository/com/google/dexmaker $ANDROID_HOME/extras/android/m2repository/com/google
- Entonces cambie la versión en
app/build.gradle
:androidTestCompile 'com.google.dexmaker:dexmaker:1.3-SNAPSHOT'
- O bien
pom.xml
si usa maven para crear o sobrescribir suslibs/dexmaker.jar
con~/.m2/repository/com/google/dexmaker/dexmaker/1.3-SNAPSHOT/dexmaker-1.3-SNAPSHOT.jar
si usa eclipse /hormiga
- O bien
Además, FYI, el informe de emisión original para el mismo problema en Google Code también.
Puede agregar el núcleo de mockito como una dependencia en su lugar. Entonces, ese error no sucederá y usted no necesitará una solución.
dependencies { ... testCompile 'org.mockito:mockito-core:1.10.19' }
- ¿Cómo incluir archivos de datos con el APK de la aplicación?
- ¿Alternativa a AbsoluteLayout en Android?