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"
}
Ответы
Ответ 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