unitarias unit test studio pruebas ejemplo java android android-studio junit kotlin

java - studio - unit test android



Android Studio 3.0 Canary 1: las pruebas de Kotlin o las pruebas de Java que se refieren a las clases de Kotlin fallan (4)

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 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 que quería probar la clase, primero escribí un unittest de ejecución local (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()) } }

Se compila y se ejecuta pero con el mensaje de error:

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

Por lo tanto, 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 también falló, esta vez no se pudo encontrar la clase "Monedero" de Kotlin:

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, sino a las clases de Java que solo se completa satisfactoriamente.

Mi archivo project build.gradle 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 mi build.gradle específico del módulo:

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


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 https://youtrack.jetbrains.com/issue/KT-17951 un https://youtrack.jetbrains.com/issue/KT-17951 para el problema mencionado en el PO.

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

  • 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. Luego agregué estas dos tareas de compilación 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 menú de configuración 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 Predeterminados> JUnit de Android Y edité la configuración de la siguiente manera:

  • Prueba tipo = Todo en paquete
  • Modo de formulario = ninguno
  • Repetir = una vez
  • Paquete = mi paquete base como com.yourname
  • Buscar pruebas = en un solo módulo
  • Dejé intacta la sección central (opciones de VM, etc.)
  • En la sección "Antes del lanzamiento", agregue dos entradas haciendo clic en el icono más:
  • Ejecute la tarea de gradle: seleccione su build.gradle de su módulo de aplicación y luego en tasks ingrese el nombre copyTestClasses y haga clic en OK
  • Agregue una segunda tarea Ejecutar 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 ahora ejecute sus pruebas

Esto es lo que parece al final:


@AgentKnopf es el correcto, pero 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 }

agrega tareas automáticamente para ti


Este error solucionado en Android Studio 3.0 Canary 3


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 configuración JUnit Run / Debug de prueba en la parte inferior hacia abajo ''before launch'', hay ''Gradle-aware make'' en ella, + otra sección, seleccione gradle task , seleccione el archivo project build.gradle que se encuentra y escriba copyTestClasses . Haga clic aquí para obtener capturas de pantalla de diferentes marcos de prueba, pero donde la plomería funciona de la misma manera.

Es posible que necesite cambiar / agregar más plomería de directorio dependiendo de su tipo de compilación. La forma de encontrar esos lugares extraños es mediante búsqueda bruta en el árbol de proyectos para los archivos .class relevantes.