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
- Delegación de propiedad horneada por map mutable
- La image no se muestra en Recyclerview usando Glide
- Configuración regional del cambio de idioma en la progtwigción "Kotlin" Como la configuration regional funciona en Java Fine, pero en el idioma Kotlin no funciona
- Cómo configurar una aplicación Gluon con Kotlin y Tornado FX
- Diseños de Anko: layouts distintivos en applyRecursively
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" }
- ¿Cómo creo una instancia de un tipo genérico?
- Excepción de puntero nulo en Spring Proxy Class y Kotlin
- ¿Hay algún error sobre selectionKey.attachment () en java nio?
- Obtener el porcentaje de orientación en píxeles mediante progtwigción
- Evite el conflicto de time de ejecución / stdlib de Kotlin con otros complementos
- Cómo pasar la interfaz en mi adaptador Kotlin RecylerView y recibir una callback en la actividad de Kotlin
- Kotlin con JPA: infierno de constructor pnetworkingeterminado
- java.lang.NoClassDefFoundError en Kotlin
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:
@AgentKnopf es el correcto, pero necesita agregar tareas cada nuevo caso de testing 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 }
agrega tareas automáticamente para ti
Este error solucionado en Android Studio 3.0 Canary 3
- ¿Cuándo debería uno preferir las funciones de extensión de Kotlin?
- Kotlin: Equivalente de getClass () para KClass