当前位置: 首页 > 面试题库 >

不模拟ContentValues的方法

空成天
2023-03-14
问题内容

我正在使用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单元测试支持”页面上所示:

方法……不嘲笑。”

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

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

要解决此问题,请使用诸如Mockito之类的模拟框架,而不是调用诸如之类的真实方法put,或者切换到Robolectric以使用本来仅在本机代码中实现的类的Java等效项。



 类似资料:
  • 上面还有第二个问题。当我在Expects块中定义mock类时(如上),似乎只调用了构造函数,而不是,因此没有正确初始化对象。我通过将它移到方法中并在那里实例化该类来解决这个问题。看起来是这样的: 因此,这似乎得到了要调用的正确构造函数,但似乎还在调用。有什么见解吗?

  • 所以我想做一些事情 但我得到了空异常

  • 问题内容: 使用Mockito,有什么方法可以模拟类中的某些方法,而不能模拟其他方法? 例如,在这个(当然是人为设计的)类中,我想模拟和返回值(如下面的测试代码所示),但我想按类中的代码执行乘法 问题答案: 要直接回答你的问题,是的,你可以模拟某些方法而无需模拟其他方法。这称为部分模拟。有关更多信息,请参见Mockito文档。 例如,你可以在测试中执行以下操作: 在这种情况下,除非thenCall

  • 在安装到AEM 5.6.1实例之前,我正在使用maven构建和测试我的代码。我已经编写了单元测试,这些测试使用wcm的实现从aem模拟中获益。io和其他需要使用powermockito模拟静态方法的单元测试。 以下是我对aem上下文、sling Mock和powermock的maven依赖关系。 在我的课堂上,我正在为aem上下文设置规则,并准备一些用于模拟的静态类: 当我通过命令行运行mvn测试

  • 我试图在测试中模拟一个调用,但我得到了一个错误,因为它调用了真正的方法,而不是模拟它。 这是我的方法 } 这是我的测试课 测试实际上调用了受保护的方法config Setter,并在设置代理时失败。帮助我理解我在这里做错了什么。