37 votes

Android Studio 3.0 Canary 1: les tests Kotlin ou Java faisant référence à des classes Kotlin échouent

Mise à JOUR

Un bug a été déposé pour cette question ici: https://youtrack.jetbrains.com/issue/KT-17951

Mise à JOUR 2

Le bogue a été corrigé dans Android Studio 3.0 Canaries 3

Post Original

J'ai juste commencé à jouer avec Android Studio 3.0, j'ai activé kotlin soutien de l'obtenir-aller. J'ai écrit un vraiment simple Kotlin classe dans mon projet:

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()
}

Maintenant, je voulais tester la classe, j'ai d'abord écrit un exécutant localement unittest (répertoire de test) dans 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())
    }
}

Il compile et s'exécute, mais avec le message d'erreur:

Classe non trouvé: "com.agentknopf.hachi.référentiel.de modèle.WalletTestKotlin"Vide de test suite.

J'ai donc ré-écrit le test 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());
    }
}

Cependant que le test a échoué aussi bien cette fois, le Kotlin classe "porte-monnaie" n'a pas pu être trouvé:

java.lang.NoClassDefFoundError: com/example/repository/modèle/porte-monnaie

Je me demande si je suis absent quelque chose ... cours d'Exécution Java de Test, qui ne se réfère pas à Kotlin classes, mais à des classes Java uniquement termine avec succès.

Mon projet de construction.gradle fichier est celui par défaut:

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

Les dépendances de mon Module spécifique à la construire.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"
}

15voto

kat Points 151

Solution de contournement (pour l'instant):

Mettre ceci dans votre (niveau application) construire.gradle:

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

Puis modifier le test JUnit Run/Debug configuration dans le fond", avant le lancement de la", il y a 'Gradle-conscient de faire de" il en, + une autre section, sélectionnez gradle task, sélectionnez projet build.gradle le fichier il est, et tapez copyTestClasses. Cliquez ici pour les captures d'écran de différents framework de test, mais où la plomberie fonctionne de la même manière.

Vous devrez peut-être modifier/ajouter plus de répertoire de plomberie en fonction de votre type de build. La façon dont vous trouver ces endroits bizarres est la recherche de l'arborescence du projet pour le .les fichiers de classe.

12voto

Zainodis Points 917

Remarque: le Problème a été résolu avec Android Studio 3.3 Canaries

Grâce à @kat, pour me montrer dans la bonne direction. Tout d'abord - un bug a été déposé pour le problème mentionné dans l'OP.

Ma configuration est comme suit: Kotlin Tests sont dans le même répertoire que Java tests. Pour obtenir les deux cas d'utilisation de travail:

  • Reportez-vous à kotlin classes en Java tests
  • Reportez-vous à kotlin classes dans kotlin tests

D'abord supprimer tous les autres test run-configurations que vous pourriez avoir. Ensuite, j'ai ajouté ces deux gradle construire des tâches dans mon application niveau de la construction.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"
    }
}

J'ai ensuite ouvert l'exécuter menu de configuration via Exécuter > Modifier les configurations. Là, sur la gauche, j'ai supprimé le haut-niveau Android JUnit configurations. Je clique ensuite sur paramètres par Défaut > Android JUnit Et modifié la configuration comme suit:

  • Test type = Tous dans le paquet
  • Forme mode = none
  • Répétez = une fois
  • Package = mon forfait de base comme com.votrenom
  • Recherche de tests = dans un seul module
  • J'ai quitté le milieu de la section intacte (VM options etc)
  • Dans la "Avant le lancement de la section" ajouter deux entrées en cliquant sur l'icône:
  • Exécuter gradle de la tâche: Sélectionnez votre version.gradle de votre application module, puis dans les tâches entrez le nom copyTestClasses et cliquez sur OK
  • Ajouter un deuxième Run gradle tâche comme avant, mais cette fois comme un nom de tâche entrez copySdkClasses et cliquez sur OK
  • Cliquez sur Appliquer dans la configuration et le maintenant de l'exécution des tests

C'est à quoi il ressemble en fin de compte:enter image description here

4voto

user2939690 Points 124

@AgentKnopf juste comme il faut, mais vous devez ajouter des tâches à chaque nouveau scénario de test comme celui-ci

entrez la description de l'image ici

 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
}
 

ajouter des tâches automatiquement pour vous

-1voto

Zhang Xiang Points 89

Ce bogue corrigé dans Android Studio 3.0 Canary 3

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X