我正在与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");
}
}
如何避免此错误?
答案 0 :(得分:13)
您正在使用专为模拟而设计的库,缺少实现。因为你的测试实际上是在对象上调用方法,而不使用模拟库来赋予它行为,所以它会给你这个消息。
与Android Unit Testing Support page:
相同“方法......没有嘲笑。”
用于运行单元测试的android.jar文件不包含任何实际代码 - 由真实设备上的Android系统映像提供。相反,所有方法都抛出异常(默认情况下)。这是为了确保您的单元测试仅测试您的代码,并且不依赖于Android平台的任何特定行为(您没有明确嘲笑,例如使用Mockito)。如果证明有问题,可以将下面的代码段添加到build.gradle中以更改此行为:
android { // ... testOptions { unitTests.returnDefaultValues = true } }
要解决此问题,请使用像Mockito这样的模拟框架,而不是像put
那样调用实际方法,或者切换到Robolectric以使用Java等价的类,否则只能在本机代码中实现。