Robolectric + 模拟

Robolectric + Mockito

正在尝试使用 Robolectric 构建 android 单元测试。每次我需要模拟一个属于我的项目的方法时,创建一个影子 class 就变得有点繁重了。我认为在这种情况下使用 Mockito 会更容易和更轻便。

但是当我尝试使用 Mockito 方法时出现错误 java.lang.IllegalArgumentException:dexcache == null(并且找不到默认值;考虑设置 'dexmaker.dexcache' 系统 属性)

为了解决这个问题,我认为需要通过调用

来设置 dexcache 属性

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

但我不知道在 Robolectric 中可以调用 getInstrumentation。请建议一种推荐的方法来模拟我在 Robolectric.

中的项目方法

您可以将 Mockito 与 Robolectric 一起使用;但是,您需要确保添加的是 "normal" Mockito 依赖项,而不是 Mockito-Android 或 dexmaker 依赖项。

Mockito 通过生成 类 来工作;在桌面 JRE(例如您的单元测试环境)上,这意味着生成 Java CLASS 文件,但在 Android 设备和模拟器上,这意味着生成 DEX 文件。但是,如果 DexMaker 存在于类路径中,Mockito 将机会主义地使用它,即使 运行 在模拟器之外,如 Robolectric 单元测试那样。调整您的依赖项以确保不包含 dexmaker,这将避免 dexmaker 或 dexcache 出现任何问题。

将您对 Robolectric 和 Mockito 的想法分开的一个好方法是

Mockito:模拟并验证您的 Java 类 / 非 Android 框架依赖项

Robolectric:在需要时提供 TestRunner 和工作 Android 框架元素,例如意图,上下文

Build.gradle 依赖关系

dependencies {
    ...
    testCompile 'junit:junit:4.12'
    testCompile 'org.robolectric:robolectric:3.0'
    testCompile 'org.mockito:mockito-core:1.10.19'
}

Robolectric 测试运行器

@RunWith(RobolectricTestRunner.class)
public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

测试愉快!