web-dev-qa-db-fra.com

Les tests de l'unité robotique échouent après Multidex

J'ai donc récemment fusionné ma mise à niveau robolectric 3.0 avec notre ligne principale, qui avait ajouté la prise en charge multidex à notre application. Malheureusement, cela a eu l'effet secondaire malheureux de faire échouer/ne pas exécuter nos tests - ils s'arrêtaient simplement après la première tentative échouée d'installation de MultiDex, avec cette trace de pile:

Java.lang.RuntimeException: Java.lang.RuntimeException: Multi dex installation failed (/Users/me/Data/Projects/my-Android/myapp/. (Is a directory)).
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.Java:257)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.Java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:222)
at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.Java:194)
at org.junit.runners.ParentRunner.run(ParentRunner.Java:300)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.Java:86)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.Java:49)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.Java:69)
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.Java:48)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:606)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.Java:35)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.Java:24)
at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.Java:32)
at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.Java:93)
at com.Sun.proxy.$Proxy2.processTestClass(Unknown Source)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.Java:105)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:606)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.Java:35)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.Java:24)
at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.Java:355)
at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.Java:64)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
at Java.lang.Thread.run(Thread.Java:744)

J'ai essayé de mettre en œuvre diverses solutions, telles que la capture de RuntimeException dans mon Multidex.Install (comme indiqué ici https://github.com/robolectric/robolectric/issues/1328 ) et en utilisant le shadow MultiDex fourni par Robolectric, mais qui échoue simplement avec une Gradle TaskExecutionException et se termine avec la valeur 255.

Quelqu'un a-t-il déjà trouvé un moyen de résoudre ce problème? Cela ralentit vraiment mon flux de travail.

42
hendersawn

Ajoutez simplement la dépendance de l'ombre multi-dex:

testImplementation "org.robolectric:shadows-multidex:4.0.1"

Si vous utilisez Robolectric <3.4 à la place, utilisez:

testImplementation "org.robolectric:multidex:3.4.2"
130
DoronK