首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android上的Mockito + Dexmaker

Android上的Mockito + Dexmaker
EN

Stack Overflow用户
提问于 2012-09-05 00:19:12
回答 7查看 16.9K关注 0票数 37

我正在尝试在我的Android项目中使用Mockito。我找到了处理它的非常好的教程:http://www.paulbutcher.com/2012/05/mockito-on-android-step-by-step/

基本上,它使用了新版本的Mockito + Dexmaker,一切都像预期的那样工作。

然而,当我试图模拟一些Android特定的对象时,即:

代码语言:javascript
复制
Context context = mock(Context.class);

我收到此异常:

代码语言:javascript
复制
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)

你知道怎么修复它吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-03-14 18:37:00

从@rjath对@MrChaz的回答的评论来看,这对我来说更好:

代码语言:javascript
复制
System.setProperty(
    "dexmaker.dexcache",
    getInstrumentation().getTargetContext().getCacheDir().getPath());

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

票数 33
EN

Stack Overflow用户

发布于 2012-10-02 01:27:17

我设法拼凑了一个似乎对我有效的修复方法。在清单中,我添加了读写外部存储。在测试中,我将System.setProperty("dexmaker.dexcache", "/sdcard");添加到测试中。在模拟器镜像中,我添加了一张SD卡。

我相信这是可行的,因为默认情况下mockito会尝试使用应用程序缓存目录,但我从未运行过活动,因此我怀疑该目录从未由操作系统创建

票数 10
EN

Stack Overflow用户

发布于 2014-05-23 16:54:09

所以问题出在Dexmaker不能像其他人提到的那样在安卓>= 4.3上找到缓存路径,也不能像this dexmaker issue中描述的那样。

我采用了在自定义测试运行器中实现变通方法,而不是在每个测试(或它们的超类) setUp()中实现,因为它感觉不那么麻烦(它实际上只在一个地方-并且不是在每个子类中继承),并且更灵活。为了便于文档记录,以下是完成此操作所需的更改:

代码语言:javascript
复制
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中使用此类作为仪表化的测试运行器:

代码语言:javascript
复制
<instrumentation
    android:name="my.package.CustomInstrumentationTestRunner"
    android:targetPackage="my.target.package" />

或者使用gradle构建时的build.gradle

代码语言:javascript
复制
android {
    defaultConfig {
        // ...
        testInstrumentationRunner 'my.package.CustomInstrumentationTestRunner'
    }
    // ...
}

如果您有其他instrumentation条目,则可以在它们之间进行切换,或者在on the command line运行配置中选择一个条目。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12267572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档