+的Mockito上Dexmaker的Android(Mockito + Dexmaker on A

2019-06-27 19:42发布

我想在我的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)

不知道如何解决它?

Answer 1:

从@ MrChaz的答案@ rjath的评论,这个工作对我来说更好:

System.setProperty(
    "dexmaker.dexcache",
    getInstrumentation().getTargetContext().getCacheDir().getPath());

我把它放在我的setUp()方法。



Answer 2:

我已经成功地拼凑起来,这似乎是为我工作的一个修正。 要清单,我添加读取和写入外部存储。 到所述测试I加入System.setProperty("dexmaker.dexcache", "/sdcard"); 考验。 到模拟器像我增加了一个SD卡。

我相信这个工程,因为在默认情况下尝试的Mockito使用的应用程序缓存目录,但我从来没有运行的活动,所以我怀疑的目录从不被OS创建



Answer 3:

所以,问题是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运行配置。



Answer 4:

我有这个问题的一个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"


Answer 5:

它看起来像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):

  1. git clone https://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.gradleandroidTestCompile '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 /蚂蚁

此外,仅供参考,与原来的问题的报告对谷歌代码相同的问题也是如此。



Answer 6:

您可以添加核心的Mockito作为依赖来代替。 然后,就不会发生错误,你会不会需要一个解决办法。

dependencies {
   ... 
   testCompile 'org.mockito:mockito-core:1.10.19'
}


文章来源: Mockito + Dexmaker on Android