如何在我的安卓应用中使用 Mockito?我收到 Hamcrest 依赖项冲突,当它仅用于测试时,我不会收到这些冲突



我想在我编写的应用程序的发行版中使用Mockito的mock()clone()方法,而不仅仅是在测试中。(是的,我知道什么是测试,我不担心性能,而且我有这样的原因。)但是,当我将Mockito作为运行时依赖性时,我的项目就不会编译。它使用Mockito 1.10.19,DexMaker 1.4和Espresso 2.2.2:

,将 app/build.gradle 中的测试依赖性编译为测试依赖项:
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返回以下错误,试图使用buildassembleAndroidTest任务构建项目,在prepareDebugUnitTestDependencies任务:

与依赖性冲突'org.hamcrest:hamcrest-core'。应用程序(1.1)和测试应用程序(1.3)的已解决版本不同。有关详细信息

我可以在dependencies Gradle任务中看到Mockito 1.10.19取决于Hamcrest 1.1,Junit 4.12取决于Hamcrest 1.3,但对于我来说,此错误是奇怪的,原因有两个:

  1. 当它们是testCompileandroidTestCompile依赖项时,我没有遇到此错误,但是当时它们都被使用了。在我看来,我似乎没有添加任何新的测试依赖项,所以为什么它们现在冲突呢?
  2. assembleReleaseassembleDebug完成没有任何错误。

在我的应用程序的测试和发布构建中,我该怎么办?

我尝试了几件事,没有成功:

  • 复制opplicito和dexmaker依赖性,指定它们是正常和测试依赖性的。

  • 使用Mockito 2.我尝试了当前版本2.2.22,也尝试了2.1.0,但是在Junit测试中,我有类似的错误尝试使用mock()

    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上工作时目前没有目前的方法。

我能够通过使用一些依赖项的旧版本:junit 4.10和咖啡2.1。这将Hamcrest 1.3的依赖项更改为Hamcrest 1.1,因此每个人都使用1.1。在我的真实项目(不是问题中的测试示例)上,我还必须使用junit-dep伪像,而不是junit。(这可能是由于版本4.10和4.11 的Junit伪像之间的区别,其中junit:4.10文物在其中包含一些hamcrest类,即junit-dep:4.10junit: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'

相关内容

  • 没有找到相关文章

最新更新