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.

  • No llame a setOnClickListener para un AdapterView
  • Kotlin - Problemas con while ()
  • Operaciones paralelas en las collections de Kotlin?
  • package de alternativa protegida en kotlin
  • Clases internas de Kotlin en Java visibles públicamente
  • Mutadores de Kotlin
  • Anular la anotación @JsonIgnore para algunos controlleres. Jackson. Primavera
  • instancia :: class.java vs. instance.javaClass
  • Cómo get un PhoneStateListener cuando usa la funcionalidad Dual SIM
  • Cómo comprimir algunos observables en lenguaje Kotlin con RxAndroid
  • ¿Cómo puedo ofuscar mi sdk codificado con kotlin (y deshacerme de Metadata)