Android Studio 3.0 Canary 1: Las pruebas de Kotlin o las pruebas de Java referentes a las clases de Kotlin fallan

ACTUALIZAR

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

ACTUALIZAR 2

El error se ha corregido en Android Studio 3.0 Canary 3

Cargo original

Acabo de empezar a jugar con Android Studio 3.0 Hice compatible kotlin desde el principio. Escribí una clase 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 quería probar la clase, primero escribí un unittest que funcionaba localmente (directorio de prueba) 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()) } } 

Compila y ejecuta pero con el mensaje de error:

Clase no encontrada: "com.agentknopf.hachi.repository.model.WalletTestKotlin" Conjunto de pruebas vacío.

Así reescribí la prueba 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 prueba falló también – esta vez la clase de Kotlin "Wallet" no se pudo encontrar:

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

Me pregunto si me falta algo … Ejecutar una prueba de Java, que no se refiere a las clases de Kotlin, pero a las clases de Java sólo se completa con éxito.

Mi archivo build.gradle de proyecto es el predeterminado:

 // 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 dependencias de mis módulos específicos build.gradle:

 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):

Ponga esto en su build.gradle (de nivel de aplicación):

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

A continuación, modifique la configuración JUnit Run / Debug de abajo hacia abajo antes de lanzar, hay 'Gradle-aware make' en ella, + otra sección, seleccione gradle task , seleccione el archivo de proyecto build.gradle que se encuentra y escriba copyTestClasses . Haga clic aquí para ver capturas de pantalla de diferentes marcos de prueba, pero donde la plomería funciona de la misma manera.

Puede que necesite cambiar / añadir más directorio de plomería dependiendo de su tipo de construcción. La manera que usted encuentra esos lugares impares es por búsqueda bruta el árbol del proyecto para los archivos .class relevantes.

Nota: El problema se ha corregido con Android Studio 3.3 Canary

Gracias va @kat por mostrarme en la dirección correcta. En primer lugar – se había presentado un error para el problema mencionado en el OP.

Mi configuración es la siguiente: Kotlin Tests están en el mismo directorio que las pruebas Java. Para que ambos casos de uso funcionen:

  • Consulte las clases de kotlin en las pruebas de Java
  • Consulte las clases de kotlin en las pruebas de kotlin

Primero borre cualquier otra configuración de ejecución de prueba que pueda tener. A continuación, agregó estas dos tareas de compilación gradle en mi nivel de aplicación build.gradle:

 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" } } 

A continuación, abrí el menú de configuración de ejecución mediante Ejecutar> Editar configuraciones. Allí a la izquierda borré las configuraciones de alto nivel de JUnit para Android. A continuación, haga clic en Defaults> Android JUnit Y editado la configuración de la siguiente manera:

  • Tipo de prueba = Todo en paquete
  • Modo de formulario = ninguno
  • Repetir = una vez
  • Paquete = mi paquete base como com.su nombre
  • Buscar pruebas = en un solo módulo
  • Dejé la sección media sin tocar (opciones VM etc)
  • En la sección "Antes del lanzamiento", añada dos entradas haciendo clic en el icono más:
  • Ejecute la tarea gradle: Seleccione su build.gradle de su módulo de aplicación y luego en tareas escriba el nombre copyTestClasses y haga clic en OK
  • Agregue una segunda tarea Run gradle como antes, pero esta vez como un nombre de tarea escriba copySdkClasses y haga clic en Aceptar
  • Haga clic en Aplicar en la configuración y ejecute ahora las pruebas.

Esto es lo que parece al final: Introduzca aquí la descripción de la imagen

@AgentKnopf justo, pero usted necesita agregar tareas cada nuevo caso de prueba como este

Introduzca aquí la descripción de la imagen

 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 } 

Agregue tareas automáticamente para usted

Este error se ha corregido en Android Studio 3.0 Canary 3

  • kotlin suprime la advertencia despreciada para android
  • ¿Cómo acceder a "Activity.this" en Kotlin?
  • Convierta GsonBuilder en Kotlin
  • Firebase y recuperando elementos
  • Cómo usar Realm's en el método con Kotlin
  • ¿Cuál es la diferencia entre rizadores y brackets normales en RxJava con Kotlin
  • Gradle 3.0.0-alpha1 no es compatible con kotlin-android plugin 1.1.2-3?
  • Diseño sintético y personalizado de Kotlin en DialogFragment
  • CompileKotlin bloquea en archivo build.gradle lanza error "No se pudo encontrar el método compileKotlin () para los argumentos "
  • Call class 'constructor por reflexión con Kotlin
  • Crear una clase View / ViewGroup personalizada en Anko DSL
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.