android mockito dexmaker

Mockito+Dexmaker en Android



(6)

Estoy tratando de usar Mockito en mi proyecto de Android. He encontrado un tutorial muy bueno que lo trata: 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 intento simular algún objeto específico de Android, por ejemplo:

Context context = mock(Context.class);

Recibo esta excepcion

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?


¡Tuve este problema para un proyecto de la biblioteca Android pero NO para el proyecto de la aplicación! Configurar la propiedad del sistema "dexmaker.dexcache" como se mencionó anteriormente solucionó el problema. Estoy ejecutando el dispositivo Android 4.3 Nexus 4, compilando con herramientas 19.0.3, objetivo api 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"


Desde el comentario de @ rjath de la respuesta de @ MrChaz, esto funciona mejor para mí:

System.setProperty( "dexmaker.dexcache", getInstrumentation().getTargetContext().getCacheDir().getPath());

Lo puse en mi método setUp() .


Entonces, el problema es que Dexmaker no puede encontrar la ruta del caché en Android> = 4.3 como mencionaron otras personas y como se describe en code.google.com/p/dexmaker/issues/detail?id=2 .

Fui implementando la solución en un corredor de prueba instrumentado personalizado en lugar de en cada prueba (o su superclase) setUp() , porque se siente un poco menos hacky (realmente está en un solo lugar, y no se hereda en cada subclase) y mas flexible. En aras de la 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 configure su proyecto (o proyecto de prueba) para usar esta clase como el ejecutable de prueba instrumentado en su AndroidManifest.xml cuando construya con hormiga:

<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 en la línea de comando o seleccionar una en su configuración de ejecución IDE.


Me las arreglé para armar una solución que parece estar funcionando para mí. Al manifiesto agregué el almacenamiento externo de lectura y escritura. Para la prueba agregué 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 usar el directorio de caché de aplicaciones, pero nunca ejecuto una actividad, así que sospecho que el directorio nunca lo crea.


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.

Comprobé que este problema de "dexcache == null" aún existe a través de la versión 1.2, pero solo 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 lo tiene.

Cloné el repositorio de GitHub ( último compromiso, 12 de marzo de 2015 - ca74669 ), y ejecuté localmente, y el problema se ha solucionado (también hay confirmaciones en el historial que respaldan esto). Entonces, una vez que haya un lanzamiento 1.3, ¡con un poco de suerte este problema desaparecerá para siempre!

Cualquier persona que desee ejecutar una copia local de 1.3-SNAPSHOT, así es como lo hice (en una Mac, pero otras plataformas también deberían funcionar, 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. A continuación, cambie la versión en la app/build.gradle : androidTestCompile ''com.google.dexmaker:dexmaker:1.3-SNAPSHOT''
    • O pom.xml si usa maven para compilar, o sobrescribe sus libs/dexmaker.jar con ~/.m2/repository/com/google/dexmaker/dexmaker/1.3-SNAPSHOT/dexmaker-1.3-SNAPSHOT.jar si está usando eclipse /hormiga

Además, para su información, 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 ocurrirá y no necesitará una solución alternativa.

dependencies { ... testCompile ''org.mockito:mockito-core:1.10.19'' }