1

Я бы хотел использовать методы 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, но эта ошибка странно для меня по двум причинам:

  1. I не получили эту ошибку, когда они были testCompile и androidTestCompile зависимостей, но все они были использованы тогда. Мне кажется, что я не добавлял никаких новых тестовых зависимостей, так почему они сейчас конфликтуют?
  2. 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.

ответ

2

Мне удалось заставить это работать, используя более старые версии некоторых зависимостей: JUnit 4.10 и Espresso 2.1. Это изменяет зависимости, которые были для Hamcrest 1.3 для Hamcrest 1.1, так что каждый использует 1.1. В моем реальном проекте (не в тестовом примере в моем вопросе) мне также пришлось использовать артефакт junit-dep вместо junit. (Вероятно, это связано с a difference between the JUnit artifacts for versions 4.10 and 4.11+, где артефакт junit:4.10 включает в себя некоторые классы Хамкреста, в которых нет артефактов и junit:4.11+.) Таким образом, становятся зависимыми:

androidTestCompile('com.android.support.test.espresso:espresso-core:2.1', { 
    exclude group: 'com.android.support', module: 'support-annotations' 
}) 
compile 'com.android.support:appcompat-v7:25.0.1' 
testCompile 'junit:junit-dep:4.10' 

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' 
+0

Это работает для моих целей (по крайней мере, до сих пор). Но я понятия не имею, почему тесты androidTest были построены и правильно выполнялись с этими предположительно противоречивыми зависимостями, когда Mockito был зависимым от androidTestCompile. Если кто-нибудь может объяснить, почему, или знает, как получить более свежие версии этих пакетов для совместной работы, напишите ответ тоже! –

Смежные вопросы