我想在我编写的应用程序的发行版中使用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返回以下错误,试图使用build
或assembleAndroidTest
任务构建项目,在prepareDebugUnitTestDependencies
任务:
与依赖性冲突'org.hamcrest:hamcrest-core'。应用程序(1.1)和测试应用程序(1.3)的已解决版本不同。有关详细信息
我可以在dependencies
Gradle任务中看到Mockito 1.10.19取决于Hamcrest 1.1,Junit 4.12取决于Hamcrest 1.3,但对于我来说,此错误是奇怪的,原因有两个:
- 当它们是
testCompile
和androidTestCompile
依赖项时,我没有遇到此错误,但是当时它们都被使用了。在我看来,我似乎没有添加任何新的测试依赖项,所以为什么它们现在冲突呢? -
assembleRelease
和assembleDebug
完成没有任何错误。
在我的应用程序的测试和发布构建中,我该怎么办?
我尝试了几件事,没有成功:
复制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.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'