我正在尝试在我的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)
知道怎么修吗?
从@rjath对@MrChaz的回答的评论来看,这对我来说更有效:
System.setProperty(
"dexmaker.dexcache",
getInstrumentation().getTargetContext().getCacheDir().getPath());
我把它放在我的setUp()
方法中。
我已经设法拼凑出一个似乎对我有效的修复程序。我在清单中添加了读写外部存储。我在测试中添加了System.setProperty("dexmaker.dexcache", "/sdcard");
。在模拟器图像中,我添加了一个SD卡。
我相信这是有效的,因为默认情况下mockito尝试使用应用程序缓存目录,但我从未运行过活动,所以我怀疑该目录从未由操作系统创建
因此,问题在于Dexmaker无法在Android上找到缓存路径>=4.3,正如其他人所提到的,以及本次Dexmakeer问题中所描述的那样。
我在一个自定义的测试运行器中实现了这个变通方法,而不是在每个测试(或它们的超类)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());
}
}
并设置您的项目(或测试项目),在使用ant构建时,将此类用作其AndroidManifest.xml
中的仪器测试运行程序:
<instrumentation
android:name="my.package.CustomInstrumentationTestRunner"
android:targetPackage="my.target.package" />
或其build.gradle
,当使用渐变:构建时
android {
defaultConfig {
// ...
testInstrumentationRunner 'my.package.CustomInstrumentationTestRunner'
}
// ...
}
如果您有其他instrumentation
条目,您可以在命令行上在它们之间切换,也可以在IDE运行配置中选择一个。
我在安卓库项目中遇到了这个问题,但在应用程序项目中没有!如上所述设置System属性"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版本中仍然存在,但仅在某些设备上存在。例如,安卓5.0的Galaxy S5有问题,安卓4.4.2的Galaxy S4没有问题。
我克隆了GitHub存储库(上次提交时间为2015年3月12日,ca74669),并在本地运行,问题已经解决(历史中也有提交支持这一点)。因此,一旦有了1.3版本,希望这个问题永远消失!
任何其他想要运行1.3-SNAPSHOT本地副本的人,以下是我的操作方法(在Mac上,但其他平台也应该工作,您需要mvn、adb和dx在PATH上):
git clone
https://github.com/crittercism/dexmaker.gitcd 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构建),或者用~/.m2/repository/com/google/dexmaker/dexmaker/1.3-SNAPSHOT/dexmaker-1.3-SNAPSHOT.jar
覆盖libs/dexmaker.jar
(如果使用eclipse/ant)
- 或者
此外,仅供参考,谷歌代码上同一期的原始问题报告也是如此。
您可以将mockito核心添加为依赖项。然后,该错误就不会发生,您也不需要解决方法。
dependencies {
...
testCompile 'org.mockito:mockito-core:1.10.19'
}
我在处理test
文件夹中的资源和文件夹时发现了这个问题。事实上,只是重新启动安卓工作室就有所帮助。简单,但有效。