Android w / Kotlin pure-java-Junit NoClassDefFoundError solución no funciona

Repositorio que reproduce fielmente el error: explodes / bug-kotlinjunit

Mi aplicación de Android consiste en un module de aplicación y 4 modules de biblioteca.

Mis testings están escritas en Java puro. Las testings que no tocan el código de Kotlin funcionan bien, pero cuando ejecuto testings que usan ( MyKotlinObj::methodRef ) o entran en una class ( new MyKotlinObj() ), mi testing fallará con lo siguiente:

 java.lang.NoClassDefFoundError: com/explod/api/UserCreated at com.explod.api.Bug.initUserCreated_shouldNotTriggerNoClassDefFoundError(Bug.java:19) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMainV2.main(AppMainV2.java:131) Caused by: java.lang.ClassNotFoundException: com.explod.api.UserCreated at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 28 more 

Utilizando:

  • Android Studio 3.0 Canary 2

  • Herramientas de compilation 26.0.0-rc2

  • Versión 1.1.2-4 de Kotlin

  • Android-Gradle Plugin 3.0.0-alpha2

  • Gradle gradle-4.0-milestone-1

  • Target SDK 25

  • Min SDK 19

La solución sugerida aquí no funciona para mí:

 android { task copyTestClasses(type: Copy) { from "build/tmp/kotlin-classes/debugUnitTest" into "build/intermediates/classes/debug" } 

Parece que el equipo de Android Studio posiblemente tenga una solución, pero espero una solución alternativa que funcione. ¿Mi problema es diferente? No hay código de Kotlin en mis testings.

Resulta que el directory de copy de destino para la solución alternativa era incorrecto.

Yo había estado usando:

 task copyTestClasses(type: Copy) { from "build/tmp/kotlin-classes/devDebugUnitTest" into "build/intermediates/classes/devDebug" } task copySdkClasses(type: Copy) { from "build/tmp/kotlin-classes/devDebug" into "build/intermediates/classes/dev/debug" } 

Pero lo siguiente me funciona:

 task copyTestClasses(type: Copy) { from "build/tmp/kotlin-classes/devDebugUnitTest" into "build/intermediates/classes/dev/debug" } task copySdkClasses(type: Copy) { from "build/tmp/kotlin-classes/devDebug" into "build/intermediates/classes/dev/debug" } 

En comstackciones limpias, las classs de SDK no están disponibles. También necesitaba agregar :api:assembleDevDebug a la configuration de ejecución para que funcione desde comstackciones limpias.

  • java.lang.NoSuchMethodException cuando intenta ejecutar la aplicación TornadoFX
  • Querydsl: divide los resultados en dos o más objects
  • Los generics de kotlin tienen que escribir el parámetro de tipo
  • Por qué kotlin está equivocado: val minT: largo = -9223372036854775808L //Long.MIN_VALUE
  • El button del mango está presionado por mucho time
  • Selecciones no deseadas en RecyclerView
  • Android Studio - java.io.IOException: no se pudo generar la firma v1
  • Variable diferida con reinicio
  • Cómo burlarse del repository reactivo que devuelve Observable
  • Deserializador personalizado para cualquier list en Jackson
  • Kotlin Android Project no pudo sincronizar el Proyecto Gradle