ContentValues的方法未被模拟

时间:2016-04-11 17:17:13

标签: java android mockito

我正在与Mockito一起创建测试。在测试中,我创建了ContentValues类型的对象。当我运行此测试时,我收到错误:

java.lang.RuntimeException: Method put in android.content.ContentValues not mocked.

这是最小的代码:

import android.content.ContentValues;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {
    @Test
    public void test1() {
        ContentValues cv = new ContentValues();
        cv.put("key", "value");
    }
}

如何避免此错误?

1 个答案:

答案 0 :(得分:13)

您正在使用专为模拟而设计的库,缺少实现。因为你的测试实际上是在对象上调用方法,而不使用模拟库来赋予它行为,所以它会给你这个消息。

Android Unit Testing Support page

相同
  

“方法......没有嘲笑。”

     

用于运行单元测试的android.jar文件不包含任何实际代码 - 由真实设备上的Android系统映像提供。相反,所有方法都抛出异常(默认情况下)。这是为了确保您的单元测试仅测试您的代码,并且不依赖于Android平台的任何特定行为(您没有明确嘲笑,例如使用Mockito)。如果证明有问题,可以将下面的代码段添加到build.gradle中以更改此行为:

android {
  // ...
  testOptions { 
    unitTests.returnDefaultValues = true
  }
}

要解决此问题,请使用像Mockito这样的模拟框架,而不是像put那样调用实际方法,或者切换到Robolectric以使用Java等价的类,否则只能在本机代码中实现。