我想在我的Android项目中使用的Mockito。 我发现很不错的教程,它涉及: http://www.paulbutcher.com/2012/05/mockito-on-android-step-by-step/
基本上,它采用+的Mockito的Dexmaker新版本,一切都按预期工作。
然而,当我试图嘲弄一些Android的特定对象,即:
Context context = mock(Context.class);
我收到此异常:
java.lang.IllegalArgumentException:
dexcache == null (and no default could be found;
consider setting the 'dexmaker.dexcache' system property)
at com.google.dexmaker.DexMaker.generateAndLoad(DexMaker.java:359)
at com.google.dexmaker.stock.ProxyBuilder.buildProxyClass(ProxyBuilder.java:252)
at com.google.dexmaker.mockito.DexmakerMockMaker.createMock(DexmakerMockMaker.java:54)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26)
不知道如何解决它?
从@ MrChaz的答案@ rjath的评论,这个工作对我来说更好:
System.setProperty(
"dexmaker.dexcache",
getInstrumentation().getTargetContext().getCacheDir().getPath());
我把它放在我的setUp()
方法。
我已经成功地拼凑起来,这似乎是为我工作的一个修正。 要清单,我添加读取和写入外部存储。 到所述测试I加入System.setProperty("dexmaker.dexcache", "/sdcard");
考验。 到模拟器像我增加了一个SD卡。
我相信这个工程,因为在默认情况下尝试的Mockito使用的应用程序缓存目录,但我从来没有运行的活动,所以我怀疑的目录从不被OS创建
所以,问题是Dexmaker不能够找到在Android> = 4.3缓存路径,其他人提及和描述这个dexmaker问题 。
我又可以在每个测试执行在一个自定义仪器测试运行的解决办法,而不是(或它们的超类) setUp()
因为感觉有点少哈克(它真的是只有一个地方-在每个子类中不能继承)和更灵活。 对于文档的缘故这些都是必要的修改,这样做:
public class CustomInstrumentationTestRunner extends InstrumentationTestRunner {
@Override public void onCreate (final Bundle arguments) {
super.onCreate(arguments);
// temporary workaround for an incompatibility in current dexmaker (1.1) implementation and Android >= 4.3
// cf. https://code.google.com/p/dexmaker/issues/detail?id=2 for details
System.setProperty("dexmaker.dexcache", getTargetContext().getCacheDir().toString());
}
}
并设置项目(或测试项目)使用这个类作为它的仪表测试运行AndroidManifest.xml
有蚂蚁建设时:
<instrumentation
android:name="my.package.CustomInstrumentationTestRunner"
android:targetPackage="my.target.package" />
或它build.gradle
与gradle这个建筑的时候:
android {
defaultConfig {
// ...
testInstrumentationRunner 'my.package.CustomInstrumentationTestRunner'
}
// ...
}
如果您有其他instrumentation
项目,你可以他们要么之间切换, 在命令行上或选择一个在你的IDE运行配置。
我有这个问题的一个Android库项目,但对于应用项目! 上面的设置解决这个问题做过提到的系统属性“dexmaker.dexcache”。 我运行的是Android 4.3的Nexus 4设备,具有19.0.3工具,目标跟踪API 19楼,我的依赖关系:
androidTestCompile "org.mockito:mockito-core:1.9.5"
androidTestCompile "com.google.dexmaker:dexmaker:1.0"
androidTestCompile "com.google.dexmaker:dexmaker-mockito:1.0"
它看起来像dexmaker项目已经从谷歌代码到GitHub上 。
在Maven的中央资料库有刊登在2014年3月和2014年12月1.1版本和1.2。
我已经验证了这个“dexcache == NULL”的问题仍然通过1.2版本存在 - 但仅限于某些设备。 例如,银河S5与Android 5.0有问题,并且银河S4与Android 4.4.2没有。
我克隆GitHub的库( 最后一次提交的2015年3月12日- ca74669 ),并在本地跑,问题已得到修复(也有在支持这一行动的历史提交)。 所以,一旦有一个1.3版本,希望这个问题消失了!
任何人想运行1.3快照的本地副本,这里就是我这样做(在Mac上,但其他的平台应太,你需要MVN, 亚洲开发银行 ,并在PATH DX):
-
git clone
https://github.com/crittercism/dexmaker.git -
cd dexmaker
-
mvn install -Dmaven.test.skip=true
-
cp -R ~/.m2/repository/com/google/dexmaker $ANDROID_HOME/extras/android/m2repository/com/google
- 然后在修改版本
app/build.gradle
: androidTestCompile 'com.google.dexmaker:dexmaker:1.3-SNAPSHOT'
- 或者
pom.xml
如果使用Maven构建,或覆盖您libs/dexmaker.jar
与~/.m2/repository/com/google/dexmaker/dexmaker/1.3-SNAPSHOT/dexmaker-1.3-SNAPSHOT.jar
,如果你使用eclipse /蚂蚁
此外,仅供参考,与原来的问题的报告对谷歌代码相同的问题也是如此。
您可以添加核心的Mockito作为依赖来代替。 然后,就不会发生错误,你会不会需要一个解决办法。
dependencies {
...
testCompile 'org.mockito:mockito-core:1.10.19'
}