android robolectric dex

android - El uso de MultiDexApplication hace que la prueba Robolectric para la clase de aplicación se rompa



(3)

Agregue sombras multi-dex como su dependencia :

testCompile "org.robolectric:shadows-multidex:3.0"

Esto simulará la llamada MultiDex.install y no hará nada, ya que no hay dex en Robolectric

Agregando soporte Multi dex con el soporte v4-r21 usando gradle def ( https://plus.google.com/+IanLake/posts/JW9x4pcB1rj )

apply plugin: ''com.android.application'' android { compileSdkVersion 19 buildToolsVersion "20.0.0" defaultConfig { applicationId "info.osom.multidex" minSdkVersion 19 targetSdkVersion 19 versionCode 1 versionName "1.0" } buildTypes { release { runProguard false proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro'' } } dexOptions { preDexLibraries = false } afterEvaluate { tasks.matching { it.name.startsWith(''dex'') }.each { dx -> if (dx.additionalParameters == null) { dx.additionalParameters = [] } dx.additionalParameters += ''--multi-dex'' dx.additionalParameters += "--main-dex-list=$projectDir/multidex.keep".toString() }

Ahora esto funciona para la aplicación en sí misma y puedo compilar e implementar, pero cuando ejecuto una prueba roboléctrica para mi clase de Aplicación, recibo un error de ZipUtils (que está atrapado en MultiDex.java). Las otras pruebas están funcionando bien. Aquí está la huella -

Causado por: java.lang.RuntimeException: la instalación de Multi dex falló (/ Users / Code / android-code / android /. (Es un directorio)). at android.support.multidex.MultiDex.install (MultiDex.java:178) en android.support.multidex.MultiDexApplication.attachBaseContext (MultiDexApplication.java:39) en android.app.Application.attach (Application at java:181) org.fest.reflect.method.Invoker.invoke (Invoker.java:112) en org.robolectric.internal.ParallelUniverse.setUpApplicationState (ParallelUniverse.unUpApplation en las partes de las personas). at org.robolectric.RobolectricTestRunner $ 2.evaluate (RobolectricTestRunner.java:236) en org.junit.runners.ParentRunner.runLeaf Esta es una de las partes en que se encuentra en este artículo. at org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:50) en org.junit.runners.ParentRunner. 3.ParentRunner.p.nun.p.nun.p.n. : 63) en org.junit.runners.ParentRunner.runChildren (ParentRunner.java:236) en org.junit.runne rs.ParentRunner.access $ 000 (ParentRunner.java:53) en org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.java:229) en org.robolectric.RobolectricTestRunner (RobolectricTestRunner.java). junit.runners.ParentRunner.run (ParentRunner.java:309) en org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass (JUnitTestClassExecuter.java:86) en org.gradle.pi.i testing.junit.JUnitTestClassExecuter.execute (JUnitTestClassExecuter.java:49) en org.gradle.api.internal.tasks.testing.junit.JunitTestCcel.encon. testing.SuiteTestClassProcessor.processTestClass (SuiteTestClassProcessor.java:48) en org.gradle.messaging.dispatch.ReflectionDispatch.dispatch (ReflectionDispatch.patch.ppl.p.p.p.p.p.p.Js.jpg en org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch (ContextClassLoaderDispatch.jav a: 32) en org.gradle.messaging.dispatch.ProxyDispatchAdapter $ DispatchingInvocationHandler.invoke (ProxyDispatchAdapter.java:93) en com.sun.proxy. $ Proxy2.processTestClass (Fuente desconocida) en org.gradle.api.internal.tasks .testing.worker.TestWorker.processTestClass (TestWorker.java:105)


Debe crear una clase de aplicación que herede de MultiDexApplication attachBaseContext (Context) es Override, y aplastar una excepción si se ejecuta en JavaVM.

import android.content.Context; import android.support.multidex.MultiDexApplication; public class Application extends MultiDexApplication { @Override protected void attachBaseContext(Context base) { try { super.attachBaseContext(base); } catch (Exception e) { String vmName = System.getProperty("java.vm.name"); if (!vmName.startsWith("Java")) { throw e; } } } }