Android上的Mockito + Dexmaker

ste*_*mit 37 android mockito dexmaker

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

基本上它使用新版本的Mockito + Dexmaker,一切都按预期工作.
但是,当我尝试模拟一些Android特定对象时,即:

Context context = mock(Context.class);
Run Code Online (Sandbox Code Playgroud)

我收到这个例外:

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)
Run Code Online (Sandbox Code Playgroud)

知道怎么解决吗?

Adi*_*ain 33

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

System.setProperty(
    "dexmaker.dexcache",
    getInstrumentation().getTargetContext().getCacheDir().getPath());
Run Code Online (Sandbox Code Playgroud)

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


MrC*_*haz 10

我已经设法拼凑了一个似乎对我有用的修复程序.我在清单中添加了读写外部存储.为了测试,我加入System.setProperty("dexmaker.dexcache", "/sdcard");了测试.我在模拟器图像中添加了一张SD卡.

我相信这是有效的,因为默认情况下mockito尝试使用apps缓存目录,但我从未运行过活动所以我怀疑该目录永远不会被OS创建

  • 您也可以按照此处的说明调用以下内容:http://code.google.com/p/dexmaker/issues/detail?id = 2 ...'getInstrumentation().getTargetContext().getCacheDir();' (3认同)

des*_*eim 8

所以问题在于Dexmaker无法像其他人提到的那样在Android> = 4.3上找到缓存路径,并且正如此dexmaker问题所述.

我在自定义的仪表化测试运行器中实现了变通方法,而不是在每个测试(或它们的超类)中setUp(),因为它感觉不那么hacky(它实际上只在一个地方 - 而不是在每个子类中继承)并且更灵活.为了便于记录,这些是必要的更改:

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

并设置您的项目(或测试项目),以便在AndroidManifest.xml使用ant构建时使用此类作为检测的测试运行器:

<instrumentation
    android:name="my.package.CustomInstrumentationTestRunner"
    android:targetPackage="my.target.package" />
Run Code Online (Sandbox Code Playgroud)

或者build.gradle用gradle建造时:

android {
    defaultConfig {
        // ...
        testInstrumentationRunner 'my.package.CustomInstrumentationTestRunner'
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果您有其他instrumentation条目,则可以在命令行上切换它们,也可以在IDE运行配置中选择一个条目.