【问题标题】:Robolectric + MockitoRobolectric + Mockito
【发布时间】:2016-03-13 13:34:40
【问题描述】:

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

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

为了解决这个问题,我认为需要通过调用来设置 dexcache 属性

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

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

【问题讨论】:

    标签: android unit-testing mockito robolectric


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      区分您对 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);
          }
      }
      

      测试愉快!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多