ContentValues的方法没有被模拟

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

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

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

与在Androidunit testing支持页面上一样 :

“方法……不要嘲笑。”

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

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

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