Я бы хотел использовать методы mock()
Mockito и версию выпуска приложения, которое я пишу, а не только в тестах. (Да, я знаю, какие тесты, я не беспокоюсь о производительности, и у меня есть a reason for this.) Но когда я включаю Mockito в зависимость от времени выполнения, мой проект не компилируется. Он отлично компилируется в качестве тест-зависимости в app/build.gradle
, используя Mockito 1.10.19, Dexmaker 1.4 и Espresso 2.2.2:Как я могу использовать Mockito в своем Android-приложении? Я получаю конфликты зависимостей Hamcrest, которые я не получаю, когда он используется только в тестах
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.1"
defaultConfig {
minSdkVersion 10
targetSdkVersion 25
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
}
dependencies {
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.0.1'
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.10.19'
androidTestCompile 'com.crittercism.dexmaker:dexmaker:1.4'
androidTestCompile 'com.crittercism.dexmaker:dexmaker-dx:1.4'
androidTestCompile 'com.crittercism.dexmaker:dexmaker-mockito:1.4'
}
Но когда я пытаюсь изменить их, чтобы во время выполнения зависимостей так:
compile 'org.mockito:mockito-core:1.10.19'
compile 'com.crittercism.dexmaker:dexmaker:1.4'
compile 'com.crittercism.dexmaker:dexmaker-dx:1.4'
compile 'com.crittercism.dexmaker:dexmaker-mockito:1.4'
Gradle возвращает следующую ошибку, пытаясь построить проект с build
или assembleAndroidTest
задач, во время prepareDebugUnitTestDependencies
задачи:
Конфликт с зависимостью «org.hamcrest: hamcrest-core». Разрешенные версии для приложения (1.1) и тестового приложения (1.3) различаются. См. http://g.co/androidstudio/app-test-app-conflict.
Я могу видеть в Gradle задачи dependencies
что Mockito 1.10.19 зависит от Hamcrest 1.1, и JUnit 4,12 зависит от Hamcrest 1.3, но эта ошибка странно для меня по двум причинам:
- I не получили эту ошибку, когда они были
testCompile
иandroidTestCompile
зависимостей, но все они были использованы тогда. Мне кажется, что я не добавлял никаких новых тестовых зависимостей, так почему они сейчас конфликтуют? assembleRelease
иassembleDebug
полный без ошибок.
Что я могу сделать, чтобы использовать Mockito как в тестах, так и в выпуске моего приложения?
Я попробовал несколько вещей, без успеха:
дублирования зависимостей Mockito и Dexmaker, определяя их как в обычном режиме и в зависимости испытаний.
с помощью Mockito 2. Я попробовал текущую версию 2.2.22, а также 2.1.0, но либо я получил подобную ошибку, пытаясь использовать
mock()
в тесте JUnit:java.lang.AbstractMethodError: com.android.dx.mockito.DexmakerMockMaker.isTypeMockable(Ljava/lang/Class;)Lorg/mockito/plugins/MockMaker$TypeMockability; at org.mockito.internal.util.MockUtil.typeMockabilityOf(MockUtil.java:29) at org.mockito.internal.util.MockCreationValidator.validateType(MockCreationValidator.java:22) at org.mockito.internal.creation.MockSettingsImpl.validatedSettings(MockSettingsImpl.java:168) at org.mockito.internal.creation.MockSettingsImpl.confirm(MockSettingsImpl.java:162) at org.mockito.internal.MockitoCore.mock(MockitoCore.java:62) at org.mockito.Mockito.mock(Mockito.java:1637) at org.mockito.Mockito.mock(Mockito.java:1550)
Из того, что Я могу найти онлайн, похоже, что для Mockito 2.x нет никакого способа работать на Android.
Это работает для моих целей (по крайней мере, до сих пор). Но я понятия не имею, почему тесты androidTest были построены и правильно выполнялись с этими предположительно противоречивыми зависимостями, когда Mockito был зависимым от androidTestCompile. Если кто-нибудь может объяснить, почему, или знает, как получить более свежие версии этих пакетов для совместной работы, напишите ответ тоже! –