Java ContentValues的方法不会被模拟

Java ContentValues的方法不会被模拟,java,android,mockito,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.Ru

我正在用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");
    }
}

如何避免此错误?

您正在使用一个为模拟而设计的库,该库缺少实现。因为您的测试实际上调用了对象上的方法,而没有使用模拟库为其提供行为,所以它提供了该消息

截至年月日:

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

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

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

如果您在某处模拟ContentValues,我在这里没有看到。我甚至没有在项目的其他地方嘲笑它;)我得到一个错误:java.lang.NoClassDefFoundError:android/os/HandlerI我不太喜欢这种行为。例如,我在一些类上编写了代码,根据原始意图的额外内容,提取额外的意图并将这些值放入其他意图中。传输、过滤和分割数据的仍然是我的代码。我不能对此进行单元测试,除非我模拟导致不同拆分的任何数据的每一个组合。。。如果目的只是。。。好。。。表现得像一种意图。这导致数千条模拟线只是为了构建所有可以用零线完成的组合。不需要模拟被动对象。@Grisgram在这种情况下可能适合你;它使用JVM友好的实现来模拟大多数Android。您也可以在模拟设备上运行好的旧API来对抗真实的API,但坦率地说,对于类似的东西,我更喜欢Robolectric。