安卓系统上的Mockito+Dexmaker



我正在尝试在我的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上,但其他平台也应该工作,您需要mvnadbdxPATH上):

  1. git clonehttps://github.com/crittercism/dexmaker.git
  2. cd dexmaker
  3. mvn install -Dmaven.test.skip=true
  4. cp -R ~/.m2/repository/com/google/dexmaker $ANDROID_HOME/extras/android/m2repository/com/google
  5. 然后在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文件夹中的资源和文件夹时发现了这个问题。事实上,只是重新启动安卓工作室就有所帮助。简单,但有效。

相关内容

  • 没有找到相关文章

最新更新