NullPointerException 使用模拟上下文创建 AppCompatImageView

2023-11-30

我收到了NullPointerException当我尝试创建一个AppCompatImageView带着嘲笑Context在测试中。与正常人做同样的事情ImageView works.

本次测试通过:

import android.content.Context;
import android.widget.ImageView;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;

import static junit.framework.Assert.assertNotNull;

@RunWith(MockitoJUnitRunner.class)
public class ParallaxViewTest {

    @Mock
    Context mContext;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void initWithContext() throws Exception {
        assertNotNull(mContext);
        ImageView imageView = new ImageView(mContext);
//        AppCompatImageView imageView = new AppCompatImageView(mContext);
    }
}

该测试未通过:

import android.content.Context;
import android.support.v7.widget.AppCompatImageView;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;

import static junit.framework.Assert.assertNotNull;

@RunWith(MockitoJUnitRunner.class)
public class ParallaxViewTest {

    @Mock
    Context mContext;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void initWithContext() throws Exception {
        assertNotNull(mContext);
//        ImageView imageView = new ImageView(mContext);
        AppCompatImageView imageView = new AppCompatImageView(mContext);
    }
}

这是崩溃报告:

java.lang.NullPointerException
    at android.support.v7.widget.ResourcesWrapper.<init>(ResourcesWrapper.java:46)
    at android.support.v7.widget.TintResources.<init>(TintResources.java:34)
    at android.support.v7.widget.TintContextWrapper.<init>(TintContextWrapper.java:100)
    at android.support.v7.widget.TintContextWrapper.wrap(TintContextWrapper.java:68)
    at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:60)
    at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:56)
    at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:52)
    at example.views.ParallaxViewTest.initWithContext(ParallaxViewTest.java:30)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.mockito.internal.runners.DefaultInternalRunner$1.run(DefaultInternalRunner.java:68)
    at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:74)
    at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:39)
    at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:161)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

这里是图书馆:

testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:2.7.18'

我该如何解决这个问题?


EDIT

我怎样才能获得模拟Context有资源吗?

该测试未通过:

    @Test
    public void initWithContext() throws Exception {
        assertNotNull(mContext); // PASS
        assertNotNull(mContext.getResources()); // DO NOT PASS
//        ImageView imageView = new ImageView(mContext);
//        AppCompatImageView imageView = new AppCompatImageView(mContext);
    }

当您查看堆栈跟踪中列出的类的源代码时(资源包装器), 你发现:

public ResourcesWrapper(Resources resources) {
  super(resources.getAssets(), resources.getDisplayMetrics(), 

第 46 行是带有 super() 的行。

进一步查看堆栈跟踪中的类,您可能会发现:

 private TintContextWrapper(@NonNull final Context base) {
  super(base);
  ...
  mResources = new VectorEnabledTintResources(this, base.getResources());

所以,长话短说,是的,你提供了一个non null模拟对象new AppCompatImageView()在你的代码中。但是你调用的代码正在打电话对此的方法mocked目的。当然,这就是您首先创建模拟的原因。但猜猜怎么了;默认情况下,模拟框架将返回null对于任何方法调用。

换句话说:你必须明白which调用将发生在该模拟上;这样你就可以准备模拟来返回一些东西non null too!

准确地说:我并不是说 TintContextWrapper() 中的那一行代码导致了这个 NPE;我主要是说:当你将一个模拟对象赋予其他代码时,你必须prepare该模拟会在将要发生的方法调用上返回合理的结果。这很可能意味着您必须创建更多模拟;这样就像mockedContext.getResources()确实返回一个non-null result.

换句话说:你必须

  • 识别该模拟对象上发生的那些调用
  • 那么你必须确保这些调用将返回非空(例如再次返回模拟对象)。

除此之外:更可能的是,真正的答案是使用安卓专用模拟框架。准备你的模拟让他们“做正确的事”很容易变成大量工作。

Maybe简单的答案是使用深桩来自mockito,只需编写

@Mock (answer = Answers.RETURNS_DEEP_STUBS)

但你需要阅读/尝试;我自己没用过这个。

考虑到你的最新情况:你需要配置你的模拟,就像

when(context.getResources()).thenReturn(someOtherMock);

例如!那就是whole模拟要点:您可以控制调用方法时会发生什么!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NullPointerException 使用模拟上下文创建 AppCompatImageView 的相关文章

  • 强制用户在 Android 中的 EditText 中输入内容

    我的活动中有几个编辑文本 我希望我的用户在提交表单之前正确输入 我该怎么做 我还有旋转器和 RadioGroup 按钮 你可以加验证在提交按钮上单击 private boolean validateFields int yourDesire
  • Firebase 数据库快速入门处理计数的方式安全吗?

    我想为文章点赞创建一个增量字段 我指的是这个链接 https firebase google com docs database android save data save data as transactions https fireb
  • 将正确的上下文传递给 greendao 的 OpenHelper 构造函数

    如果我理解正确的话 在使用数据库时 我必须执行以下操作 DaoMaster OpenHelper helper new DaoMaster OpenHelper this test db null Override public void
  • android webview 函数 onPagefinished 被调用两次

    我的android webview功能onPageFinished被调用两次 我不知道为什么 但它在 android 2 2 上运行良好 但当我将其升级到 4 时 它就不起作用了 代码附在下面 Code Override public vo
  • Android 自定义视图不能以正确的方式处理透明度/alpha

    我正在绘制自定义视图 在此视图中 我使用两个不同的绘画和路径对象在画布上绘画 我基本上是在绘制两个重叠的形状 添加 Alpha 后 视图中重叠的部分比图像的其余部分更暗 这是不希望的 但我不知道如何解决它 这是我的代码片段 用于展示我如何在
  • python 模拟第三方模块

    我正在尝试测试一些处理推文的类 我使用 Sixohsix twitter 来处理 Twitter API 我有一个类充当 Twitter 类的外观 我的想法是模拟实际的 Sixohsix 类 通过随机生成新推文或从数据库检索它们来模拟推文的
  • 以编程方式更新 Android 中的联系人姓名和电话号码

    我创建一个应用程序来读取 更新 删除联系人详细信息 这是更新联系人姓名和电话号码的问题 有人可以帮助我吗 我该怎么做 我正在使用以下代码 但它不起作用 Override public View onCreateView LayoutInfl
  • Android Studio更新到1.5后Gradle错误

    今天我已将 Android Studio 更新到 v1 5 我的 libgdx 项目在这次更新之前运行良好 现在我收到此错误消息 Error Unable to load class org gradle mvn3 org sonatype
  • 如何使用 jest 模拟第三方库

    我正在开发一个node js应用程序使用nestjs我有一堂课叫LoggerService如下 export class LoggerService private logger Rollbar constructor this logge
  • 从 TextView 中显示的数字中删除小数点[重复]

    这个问题在这里已经有答案了 对于我的简单计算器 我将结果显示在TextView 但它总是显示小数 我怎样才能删除它们 这是我的代码 public class MainActivity extends Activity implements
  • 如何在 Android NDK 中创建新的 NativeWindow 而无需 Android 操作系统源代码?

    我想编译一个 Android OpenGL 控制台应用程序 您可以直接从控制台启动 Android x86 运行 或者从 Android x86 GUI 内的 Android 终端应用程序运行 这个帖子 如何在 Android NDK 中创
  • Vimeo 视频在 Android 6 设备上停止播放

    我正在尝试在我的应用程序中播放 Vimeo 的视频 问题是在 Android 6 设备上 视频会在一定时间后停止播放 在 API 较低的设备上一切正常 时间取决于质量 对于下面提供的网址的视频 播放一定分钟 1 到 3 视频质量有多低 播放
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • FCM onMessageReceived 应用程序运行时返回空白消息和标题

    正如您在标题中所写 当应用程序关闭时 它运行良好 并且onMessageReceived获取消息正文和标题 但如果应用程序处于前台模式 运行模式 则可以发送通知 但没有消息和标题 请问该怎么办 代码 Override public void
  • Android 自定义警报对话框中的 OnClickListener

    我是一个自学成才的初学者 感谢耐心 谢谢 在 Eclipse 中 我使用自己的 xml 文件 custom dialog 创建了一个自定义警报对话框 称为 usernamealert 如果用户尚未输入用户名 即 username lengt
  • 在没有 Wifi 的情况下获取 Android 设备的 MAC 地址

    如何获取没有 Wifi 接口的 Android 设备 例如 Android 模拟器 的网络接口的 MAC 地址 通过WifiManager返回获取的WifiInfonull EDIT 更清楚地说 我必须与本地网络上的现有网络协议 不是我设计
  • Android ScrollView fillViewport 不工作

    我有一个简单的布局 名称位于顶部 按钮位于屏幕底部 或者超出该按钮 以防我添加更多项目 所以我使用带有 LinearLayout 的 ScrollView 如下所示
  • Android:如何检测手机设置中的语言已更改

    我如何检测我的手机语言是否已更改 例如 Facebook 应用程序将向我们宣布 please wait we preparing your language i used myString Locale getDefault getDisp

随机推荐

  • 通过扩展实现协议[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个协议来包装使用 UIImagePickerController 的过程 以使其在我的应用程序中更加精简 我基本上有这样的东西 public protocol MediaAccessor UIIm
  • CMake 未链接 Python

    抱歉 如果我重复一个问题 但我只是无法在互联网上的任何地方找到我正在寻找的解决方案 但我相信这是一个非常简单的问题 我正在尝试使用一些自定义 C 库扩展 python 并使用 CMake 构建我的 C 库 我正在按照以下说明进行操作http
  • 无法在 Opencv2 上导入 cv

    我使用的是 Windows 10 机器 并安装了 Python numpy 和 OpenCV官方链接使用预构建的二进制文件 我可以成功导入 numpy 和 cv2 但当我尝试导入 cv 时出现错误 import cv2 import num
  • 不同终端的不同 nCurses 行为

    我使用不同的终端获得两种不同的行为 这是我的代码 use ncurses initscr curs set 0 noecho start color define win newwin 20 50 1 1 wclear win box wi
  • 如何解决 Capybara::ElementNotFound 错误

    我遇到了以下问题 这是我第一次使用水豚 你知道我如何解决这个问题吗 谢谢 我使用 Rails 3 0 0 和以下 gem gem rails 3 0 0 gem capybara gem database cleaner gem cucum
  • 整数到字符串在综合中出错(宽度不匹配)

    我正在尝试将整数转换为字符串 使用integer image val 并将其填充或限制为特定长度 我已经制作了这个函数 当我使用时它可以很好地完成工作report陈述并模拟 function integer2string pad val i
  • 如何以编程方式拒绝来电android

    android 是否可以通过代码拒绝来电 请帮助我已经完成了一些教程 但它们对我不起作用 是的 伙计 可以尝试这个http androidsourcecode blogspot in 2010 10 blocking incoming ca
  • 德国引号在tinytex/rmarkdown 中被破坏 - 即使使用包“csquotes”

    我想要的是 我想通过 MacOS Catalina 上的 rmarkdown 和tinytex 在我的 TeX PDF 中添加德语引号 参见示例 问题 它曾经按照指导方针工作如此处提议的 但现在 它不再起作用了 我只得到英文引号 但是not
  • CSS中伪元素前的“&”是什么意思?

    以下 CSS 取自推特引导程序与号 字符的含义是什么 clearfix zoom 1 before after display table content after clear both That s LESS 而不是 CSS 此语法允许
  • 会话变量未从 http://www.xxxx.com 转移到 http://xxxx.com

    我网站上的一些用户让我意识到了这个问题 许多用户进入他们的浏览器http xxxx com然后登录 然后他们可能会点击一个链接 将他们带到http www xxxx com它要求他们再次登录 这是以前有人遇到过的已知问题吗 我尝试用谷歌搜索
  • PCIe 总线上的写入是原子的吗?

    我是 PCIe 的新手 所以这可能是一个愚蠢的问题 这似乎是询问有关 PCIe 接口的相当基本的信息 但我无法找到答案 因此我猜测我缺少一些使答案显而易见的信息 我有一个系统 其中有一个 ARM 处理器 主机 通过 PCIe 设备 与 Xi
  • 在 C# 中读取 Excel 文件时出现问题

    我正在使用此代码读取带有 OLEDB 连接的 Excel 文件 var connectionString string Format Provider Microsoft Jet OLEDB 4 0 data source 0 Extend
  • 获取聚合中嵌套数组的总和

    好吧 我有一个似乎无法解决的问题 我有一个这样的文档 playerId 43345jhiuy3498jh4358yu345j leaderboardId 5b165ca15399c020e3f17a75 data type Eclectic
  • .NET 安装包有时无法完全删除以前的版本

    我使用 VS2008 安装包分发我的应用程序 通常效果很好 当我创建应用程序的新版本时 我会进入并增加Version安装包上的属性并验证RemovePreviousVersions属性设置为 True 这在大多数情况下都工作得很好 我只是运
  • 将位图保存到 MemoryStream 时发生 GDI+ 异常

    我在 Windows 窗体应用程序中遇到问题 当我保存到 MemoryStream 时 Bitmap Save 失败 该问题似乎只间歇性地发生在一台机器上 到目前为止 而坏消息是在客户站点上 我无法在机器上进行调试 但我得到了堆栈跟踪 将问
  • Android NDK 和渲染到动态壁纸

    我只是在寻找开始学习 NDK 的机会 并考虑到一个特定的项目 我想从 NDK 端不断渲染变化的位图 以便能够在动态壁纸中显示它 因此我在这里讨论的不是渲染到 OpenGL 纹理 而是渲染到位图 我用谷歌搜索了一下 发现有一个选项可以直接操作
  • 如何在 ES6 类中创建“公共静态字段”?

    我正在创建一个 Javascript 类 我想要一个像 Java 中那样的公共静态字段 这是相关代码 export default class Agent CIRCLE 1 SQUARE 2 这是我得到的错误 line 2 col 11 C
  • XPath 中 .// 和 //* 有什么区别?

    通过 Firebug 查找相对 XPath 时 它会创建类似 id Passwd 如果我们在开头不使用点它的含义会怎么样 只需添加 在 Xpath 中 它突出显示 各种页面元素 代表什么 以下是 Gmail 密码字段的 XPath 有什么意
  • 如何使用 Retrofit 2.0 解析 XML 响应?

    您好 我是 Android 编程新手 我已经浏览了一些有关如何使用改造解析 XML 响应的链接 并且我尝试了下面的 XML 如图所示 我需要在 POJO 类中做任何必要的更改吗 但我在 Logcat 中收到 NullPointer 异常 当
  • NullPointerException 使用模拟上下文创建 AppCompatImageView

    我收到了NullPointerException当我尝试创建一个AppCompatImageView带着嘲笑Context在测试中 与正常人做同样的事情ImageView works 本次测试通过 import android conten