Android Studio 3.0 Canary 1: las testings de Kotlin o las testings de Java que se refieren a las classs de Kotlin fallan

ACTUALIZAR

Se ha presentado un error para este problema aquí: https://youtrack.jetbrains.com/issue/KT-17951

ACTUALIZACIÓN 2

El error ha sido reparado en Android Studio 3.0 Canary 3

Publicación original

Empecé a jugar con Android Studio 3.0. Permití el soporte de Kotlin desde el principio. Escribí una class de Kotlin realmente simple en mi proyecto:

data class Wallet(val coins: Int) { fun add(value: Int): Wallet = Wallet(coins + value) fun substract(value: Int): Wallet = if (coins > value) Wallet(coins + value) else throw InsufficientFundsException() } 

Ahora que quería probar la class, primero escribí un unittest de ejecución local (directory de testing) en Kotlin:

 class WalletTestKotlin { @Throws(Exception::class) @Test fun add() { Assert.assertEquals(22, Wallet(20).add(2).coins.toLong()) Assert.assertNotEquals(5, Wallet(2).add(13).coins.toLong()) } } 

Se comstack y se ejecuta pero con el post de error:

Clase no encontrada: "com.agentknopf.hachi.repository.model.WalletTestKotlin" Empty test suite.

Por lo tanto, reescribí la testing en Java:

 public class WalletTest { @Throws(exceptionClasses = Exception.class) @Test public void add() { Assert.assertEquals(22, new Wallet(20).add(2).getCoins()); Assert.assertNotEquals(5, new Wallet(2).add(13).getCoins()); } } 

Sin embargo, esa testing también falló, esta vez no se pudo encontrar la class "Monedero" de Kotlin:

java.lang.NoClassDefFoundError: com / example / repository / model / Wallet

Me pregunto si me falta algo … Ejecutar una testing de Java, que no se refiere a las classs de Kotlin, sino a las classs de Java que solo se completa satisfactoriamente.

Mi file project build.gradle es el pnetworkingeterminado:

 // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext.kotlin_version = '1.1.2-4' repositories { maven { url 'https://maven.google.com' } jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.0.0-alpha1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() maven { url 'https://maven.google.com' } mavenCentral() } } task clean(type: Delete) { delete rootProject.buildDir } 

Las dependencies de mi build.gradle específico del module:

 dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) //Kotlin support compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" //Testing libraries androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) testCompile 'junit:junit:4.12' testCompile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" } 

Solución (por ahora):

Pon esto en tu build.gradle (a nivel de aplicación):

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

Luego modifique la configuration JUnit Run / Debug de testing en la parte inferior hacia abajo 'before launch', hay 'Gradle-aware make' en ella, + otra sección, select gradle task , select el file project build.gradle que se encuentra y escriba copyTestClasses . Haga clic aquí para get capturas de pantalla de diferentes frameworks de testing, pero donde la plomería funciona de la misma manera.

Es posible que necesite cambiar / agregar más plomería de directory dependiendo de su tipo de compilation. La forma de encontrar esos lugares extraños es mediante búsqueda bruta en el tree de proyectos para los files .class relevantes.

Nota: el problema ha sido resuelto con Android Studio 3.3 Canary

Gracias a @kat por mostrarme en la dirección correcta. En primer lugar, se ha presentado un error para el problema mencionado en el PO.

Mi configuration es la siguiente: las testings de Kotlin están en el mismo directory que las testings de Java. Para que funcionen ambos casos de uso:

  • Consulte las classs de kotlin en las testings de Java
  • Consulte las classs de kotlin en las testings de kotlin

Primero borre cualquier otra configuration de ejecución de testing que pueda tener. Luego agregué estas dos tareas de compilation de gradle en mi build.gradle de nivel de aplicación:

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

Luego abrí el menu de configuration de ejecución a través de Ejecutar> Editar configuraciones. A la izquierda eliminé las configuraciones JUnit de Android de nivel superior. Luego hice clic en Pnetworkingeterminados> JUnit de Android Y edité la configuration de la siguiente manera:

  • Prueba tipo = Todo en package
  • Modo de formulario = ninguno
  • Repetir = una vez
  • Paquete = mi package base como com.yourname
  • Buscar testings = en un solo module
  • Dejé intacta la sección central (opciones de VM, etc.)
  • En la sección "Antes del lanzamiento", agregue dos inputs haciendo clic en el icono más:
  • Ejecute la tarea de gradle: select su build.gradle de su module de aplicación y luego en tasks ingrese el nombre copyTestClasses y click OK
  • Agregue una segunda tarea Ejecutar gradle como antes, pero esta vez como un nombre de tarea, escriba copySdkClasses y click Aceptar
  • Haga clic en Aplicar en la configuration y ahora ejecute sus testings

Esto es lo que parece al final: enter image description here

@AgentKnopf es el correcto, pero necesita agregar tareas cada nuevo caso de testing como este

enter image description here

 dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile("com.android.support.test.espresso:espresso-core:$espresso_version", { exclude group: 'com.android.support', module: 'support-annotations' }) testCompile "junit:junit:$junit_version" // kotlin compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" ............... } // add 2 task in run config to make kotlin test working // for junit task copyTestClasses(type: Copy) { from "build/tmp/kotlin-classes/debugUnitTest" into "build/intermediates/classes/debug" } // for instrumented test task copySdkClasses(type: Copy) { from "build/tmp/kotlin-classes/debug" into "build/intermediates/classes/debug" } afterEvaluate { compileDebugUnitTestSources.dependsOn copyTestClasses compileReleaseUnitTestSources.dependsOn copyTestClasses compileDebugAndroidTestSources.dependsOn copySdkClasses } 

agrega tareas automáticamente para ti

Este error solucionado en Android Studio 3.0 Canary 3

  • ¿Cómo enlazar el evento onClick de la vista usando Android Binding Library y Kotlin?
  • Sintaxis de construcción secundaria kotlin
  • ¿Por qué no puedo especificar dónde quiero que se desplace mi file Kotlin en Android Studio?
  • try-with-resources: la function de extensión "usar" en Kotlin no siempre funciona
  • ¿Cómo hago un "descanso" o "continuar" cuando estoy en un ciclo funcional dentro de Kotlin?
  • AppCompatActivity, ViewModel y data binding
  • Cómo usar AndroidAnnotación @ShanetworkingPref con Kotlin
  • Lectura y procesamiento de HOCON en Kotlin
  • Clase de datos sellados en Kotlin
  • Deserialization de KS JS JSON
  • kotlin + parceler + Realm