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:

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?

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 ):

  1. git clone https://github.com/crittercism/dexmaker.git
  2. cd dexmaker
  3. mvn install -Dmaven.test.skip=true
  4. cp -R ~/.m2/repository/com/google/dexmaker $ANDROID_HOME/extras/android/m2repository/com/google
  5. 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 sus libs/dexmaker.jar con ~/.m2/repository/com/google/dexmaker/dexmaker/1.3-SNAPSHOT/dexmaker-1.3-SNAPSHOT.jar si usa eclipse /hormiga

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' } 
  • Java.lang.AbstractMethodError cuando espía la LinkedList en Android
  • Llamadas de método de burla usando power mockito - org.powermock.api.mockito.ClassNotPreparedException
  • Prueba de unidad de Android con Retrofit2 y Mockito o Robolectric
  • Mockito: ¿Cómo uso getString con mockito?
  • IllegalArgumentException con Mockito
  • Robolectric buildActivity () con espía Mockito?
  • Mocking un campo inyectado en las pruebas unitarias
  • Llamar a un método de la actividad probada de una prueba usando espresso y ver sus resultados
  • Los simulacros de Mockito ejecutan el código actual de Android en Lollipop o superior
  • Prueba de Junit de Android: no se encuentra excepción de clase Mockito
  • Prueba de unidad de Android con Retrofit y Mockito
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.