ContentValues的方法没有被模拟

Pio*_*ski 4 java android mockito

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

java.lang.RuntimeException: Method put in android.content.ContentValues not mocked.
Run Code Online (Sandbox Code Playgroud)

这是最小的代码:

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

怎么做才能避免这个错误?

Jef*_*ica 13

您正在使用专为模拟而设计的库,缺少实现.因为您的测试实际上是在对象上调用方法,而不使用模拟库来为其提供行为,所以它会为您提供该消息.

与在Android单元测试支持页面上一样:

"方法......不要嘲笑."

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

android {
  // ...
  testOptions { 
    unitTests.returnDefaultValues = true
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  • `returnDefaultValues` 更改为 `isReturnDefaultValues` (2认同)