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
- ¿Trabaja Butknife 7.x con Kotlin M14?
- La actualización automática de la versión de la biblioteca para proyectos Gradle no está soportada actualmente. Actualice su build.grado manualmente
- "No hay suficiente información para inferir el parámetro T" con Kotlin y Android
- Kapt no resuelve las clases generadas por protobuf
- Kotlin kapt y componentes de arquitectura android fallan
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" }
- Objetos complementarios en las interfaces Kotlin
- ¿Cómo usar Anko DSL dentro de un Fragmento?
- ¿Cómo hacer referencia a un lambda desde dentro?
- Cómo utilizar Data Binding y Kotlin en Android Studio 3.0.0
- ¿Cómo hacer referencia a otras opiniones en Anko DSL?
- ¿Hay alguna manera de reutilizar una instancia de Job?
- Problema con enlace de datos usando Kotlin para Android
- Persistencia de habitaciones @Relation trabajando en Java pero no en Kolin
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:
@AgentKnopf justo, pero usted necesita agregar tareas cada nuevo caso de prueba como este
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
- Cómo utilizar assert en Android Studio
- ¿Deberíamos llamar realmente getLoaderManager (). InitLoader en onActivityCreated, lo que hace que onLoadFinished sea llamado dos veces