Подтвердить что ты не робот

Android Studio 3.0 Canary 1: тесты Kotlin или тесты Java, относящиеся к классам Kotlin, не работают

UPDATE

В этом выпуске исправлена ​​ошибка: https://youtrack.jetbrains.com/issue/KT-17951

ОБНОВЛЕНИЕ 2

Исправлена ​​ошибка в Android Studio 3.0 Canary 3

Оригинальная публикация

Я только начал играть с Android Studio 3.0. Я включил поддержку kotlin с самого начала. В моем проекте я написал очень простой класс Kotlin:

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

Теперь я хотел протестировать класс, сначала я написал локально исполняемый unittest (тестовый каталог) в 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())
    }
}

Он компилируется и запускается, но с сообщением об ошибке:

Класс не найден: msgstr "пустой тест". люкс.

Таким образом, я повторно написал тест в 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());
    }
}

Однако этот тест не удался - на этот раз не удалось найти класс Котлина "Кошелек":

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

Интересно, что мне что-то не хватает... Запуск теста Java, который не относится к классам Kotlin, но к классам Java только успешно завершен.

Мой файл build.gradle для проекта по умолчанию:

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

Зависимости моего модуля-сборки 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"
}
4b9b3361

Ответ 1

Временное решение (пока):

Поместите это в свой (app-level) build.gradle:

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

Затем измените тестовую конфигурацию JUnit Run/Debug внизу внизу перед запуском, там Gradle -aware make ', + другой раздел, выберите gradle task, выберите файл проекта build.gradle он находится внутри и введите copyTestClasses. Нажмите здесь для скриншотов в различных тестовых средах, но там, где сантехника работает одинаково.

Вам может потребоваться изменить/добавить больше сантехники в зависимости от типа сборки. То, как вы находите эти странные места, - это грубый поиск дерева проекта для соответствующих файлов .class.

Ответ 2

Примечание. Проблема устранена с помощью Android Studio 3.3 Canary

Спасибо, @kat за то, что показал мне в правильном направлении. Прежде всего - ошибка для проблемы, упомянутой в OP.

Моя настройка такова: тесты Kotlin находятся в том же каталоге, что и тесты Java. Чтобы использовать оба варианта использования:

  • Обратитесь к классам kotlin в тестах Java
  • Обратитесь к классам kotlin в тестах kotlin

Сначала удалите любые другие тестовые прогоны, которые у вас могут быть. Затем я добавил эти две задачи сборки gradle в моем build-уровне:

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

Затем я открыл меню конфигурации запуска с помощью команды "Выполнить" > "Редактировать конфигурации". Там слева я удалил конфигурации Android JUnit на верхнем уровне. Затем я нажал кнопку "По умолчанию" > "Android JUnit" и отредактировал конфигурацию следующим образом:

  • Тип теста = Все в пакете
  • Режим формы = none
  • Повторить = один раз
  • Пакет = мой базовый пакет, такой как com.yourname
  • Поиск тестов = в одном модуле
  • Я оставил среднюю секцию нетронутой (параметры VM и т.д.)
  • В разделе "Перед запуском" добавьте две записи, щелкнув значок "плюс":
  • Запустите задачу gradle: выберите свой build.gradle вашего модуля приложения, а затем в задачах введите имя copyTestClasses и нажмите OK
  • Добавьте вторую задачу Run gradle, как и раньше, но на этот раз в качестве имени задачи введите copySdkClasses и нажмите OK
  • Нажмите "Применить" в конфигурации и теперь выполняйте свои тесты.

Вот как это выглядит в конце: введите описание изображения здесь

Ответ 3

@AgentKnopf в порядке, но вам нужно добавлять задачи каждый новый тестовый пример, как этот

введите описание изображения здесь

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
}

автоматически добавлять задачи для вас

Ответ 4

Эта ошибка исправлена ​​в Android Studio 3.0 Canary 3