尝试使用 Robolectric 构建 android 单元测试。每次我需要模拟属于我的项目的方法时,创建一个 Shadow 类都会变得有点繁重。我认为在这种情况下使用Mockito会更容易,更轻。
但是当我尝试使用Mockito方法时,我收到一个错误java.lang.IllegalArgumentException:dexcache == null(找不到默认值;考虑设置"dexmaker.dexcache"系统属性)
为了解决这个问题,我认为需要通过调用来设置 dexcache 属性
System.setProperty("dexmaker.dexcache",getInstrumentation().getTargetContext().getCacheDir().getPath());
但我不知道在Robolectric中可以调用getInstrumentation。请建议一种推荐的方法来模拟我在 Robolectric 中项目的方法。
与 Robolectric 一起使用;但是,您需要确保添加的是"正常"的 Mockito 依赖项,而不是 Mockito-Android 或 dexmaker 依赖项。
Mockito通过生成类来工作;在桌面JRE(如单元测试环境)上,这意味着生成Java CLASS文件,但在Android设备和模拟器上,这意味着生成DEX文件。但是,如果 DexMaker 存在于类路径上,Mockito 将机会性地使用 DexMaker,即使像 Robolectric 单元测试那样在模拟器之外运行也是如此。调整依赖项以确保不包含 dexmaker,这将避免 dexmaker 或 dexcache 出现任何问题。
区分你对Robolectric和Mockito的想法的一个好方法是
Mockito:模拟并验证您的Java类/非Android框架依赖项
Robolectric:在需要时提供TestRunner和工作Android框架元素,例如Intent,Context。
Build.gradle dependencies
dependencies {
...
testCompile 'junit:junit:4.12'
testCompile 'org.robolectric:robolectric:3.0'
testCompile 'org.mockito:mockito-core:1.10.19'
}
机器人测试流道
@RunWith(RobolectricTestRunner.class)
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}
测试愉快!