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

ОБНОВИТЬ

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

ОБНОВЛЕНИЕ 2

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

Оригинальное сообщение

Я только начал играть с Android Studio 3.0. Я включил поддержку 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()) } } 

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

Класс не найден: «com.agentknopf.hachi.repository.model.WalletTestKotlin» Пустой набор тестов.

Таким образом, я повторно написал тест в 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 / Кошелек

Интересно, не хватает ли чего-то … Запуск теста 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" } 

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

Обходной путь (на данный момент):

Поместите это в свой (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.

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

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

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

  • Обратитесь к классам kotlin в тестах Java
  • См. Классы kotlin в тестах котлина

Сначала удалите любые другие тестовые прогоны, которые у вас могут быть. Затем я добавил эти две задачи построения градиента на моем уровне сборки 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" } } 

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

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

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

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

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

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