如何在我的 Android 应用程序本身中使用 Mockito?我收到 Hamcrest 依赖冲突,当它仅用于测试时我没有收到
How can I use Mockito in my Android app itself? I'm receiving Hamcrest dependency conflicts that I don't receive when it's used only in tests
我想在我正在编写的应用程序的发布版本中使用 Mockito 的 mock()
和 clone()
方法,而不仅仅是在测试中。 (是的,我知道什么是测试,我不担心性能,而且我有 a reason for this。)但是当我将 Mockito 作为 运行 时间依赖项包含时,我的项目无法编译。它在 app/build.gradle
中作为测试依赖编译得很好,使用 Mockito 1.10.19、Dexmaker 1.4 和 Espresso 2.2.2:
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'
}
但是当我尝试将这些更改为 运行-time 依赖时,如下所示:
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 returns 在 prepareDebugUnitTestDependencies
任务期间尝试使用 build
或 assembleAndroidTest
任务构建项目时出现以下错误:
Conflict with dependency 'org.hamcrest:hamcrest-core'. Resolved versions for app (1.1) and test app (1.3) differ. See http://g.co/androidstudio/app-test-app-conflict for details.
我可以在 dependencies
Gradle 任务中看到 Mockito 1.10.19 依赖于 Hamcrest 1.1,而 JUnit 4.12 依赖于 Hamcrest 1.3,但这个错误对我来说很奇怪,原因有两个:
- 当它们是
testCompile
和 androidTestCompile
依赖项时我没有得到这个错误,但它们当时都被使用了。在我看来,我没有添加任何新的测试依赖项,那么为什么它们现在会发生冲突?
assembleRelease
和 assembleDebug
完成且没有任何错误。
如何在我的应用程序的测试和发布版本中使用 Mockito?
我尝试了几件事,但没有成功:
复制 Mockito 和 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 和 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
工件包含一些 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'
我想在我正在编写的应用程序的发布版本中使用 Mockito 的 mock()
和 clone()
方法,而不仅仅是在测试中。 (是的,我知道什么是测试,我不担心性能,而且我有 a reason for this。)但是当我将 Mockito 作为 运行 时间依赖项包含时,我的项目无法编译。它在 app/build.gradle
中作为测试依赖编译得很好,使用 Mockito 1.10.19、Dexmaker 1.4 和 Espresso 2.2.2:
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'
}
但是当我尝试将这些更改为 运行-time 依赖时,如下所示:
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 returns 在 prepareDebugUnitTestDependencies
任务期间尝试使用 build
或 assembleAndroidTest
任务构建项目时出现以下错误:
Conflict with dependency 'org.hamcrest:hamcrest-core'. Resolved versions for app (1.1) and test app (1.3) differ. See http://g.co/androidstudio/app-test-app-conflict for details.
我可以在 dependencies
Gradle 任务中看到 Mockito 1.10.19 依赖于 Hamcrest 1.1,而 JUnit 4.12 依赖于 Hamcrest 1.3,但这个错误对我来说很奇怪,原因有两个:
- 当它们是
testCompile
和androidTestCompile
依赖项时我没有得到这个错误,但它们当时都被使用了。在我看来,我没有添加任何新的测试依赖项,那么为什么它们现在会发生冲突? assembleRelease
和assembleDebug
完成且没有任何错误。
如何在我的应用程序的测试和发布版本中使用 Mockito?
我尝试了几件事,但没有成功:
复制 Mockito 和 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 和 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
工件包含一些 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'