如何在android中对这行LayoutInflater.from()进行单元测试

2023-12-23

您好,我正在构建一个简单的 RecyclerView 适配器,并尝试测试适配器的所有方法,但 onCreateViewHolder 对我来说很困难。

 @Override
public NewsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_news,parent,false);
return new NewsViewHolder(v);
}

我尝试使用 mockito 构建 viewGroup 类的模拟,并在调用 getContext() 时返回 MockContext 的间谍,但似乎是因为我返回 MockContext LayoutInflater.from() 返回空指针异常。

这是我的测试

 @Test
public void testOnCreateViewHolder() throws Exception {
    ViewGroup vg = mock(ViewGroup.class);
    MockContext mockContext = new MockContext();
    MockContext spyContext = spy(mockContext);
    when(vg.getContext()).thenReturn(spyContext);


    NewsViewHolder vh = adapter.onCreateViewHolder(vg, 0);
    Assert.assertNotNull("Response cant be null",vh);
}

提前致谢。


当我遇到同样的问题时,我遇到了这个问题。最后我自己解决了。

假设你有一个简单的onCreateViewHolder像这样:

@Override
public TeamsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new NewsViewHolder(LayoutInflater
            .from(parent.getContext())
            .inflate(R.layout.fragment_news_view_holder, parent, false)
    );
}

Use PowerMock模拟的静态实例LayoutInflater。在下面的代码片段中,我使用编号注释注释了完成这项工作所需采取的所有步骤:

import android.test.mock.MockContext;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.when;
import static org.powermock.api.mockito.PowerMockito.mockStatic;

// 1. signal JUnit to run this test PowerMockRunner
@RunWith(PowerMockRunner.class)

// 2. signal PowerMock to prepare the static instance of LayoutInflater for testing
@PrepareForTest({LayoutInflater.class})
public class NewsRecyclerViewAdapterTest {

    // 3. LayoutInflater.from(context) returns an inflater, 
    // so we need to mock that one
    @Mock
    LayoutInflater mockInflater;

    @Mock
    View mockView;

    @Mock
    ViewGroup mockParent;

    private int dummyTestId;

    private MockContext mockContext;

    private NewsRecyclerViewAdapter adapter;

    @Before
    public void setUp() throws Exception {

        MockitoAnnotations.initMocks(this);

        dummyTestId = 0x10000;

        // 4. mock the static LayoutInflater in "LayoutInflater.from()" 
        // so that we can ask it to return a mockInflater that we moked above
        mockStatic(LayoutInflater.class);

        mockContext = new MockContext();

        adapter = new NewsRecyclerViewAdapter(Arrays.asList(new NewsItem(), new NewsItem(), new NewsItem()));
    }

    @Test
    public void onCreateViewHolderShouldReturnAValidViewHolder() throws Exception {

        // 5. mock the context that comes from parent ViewGroup
        when(mockParent.getContext()).thenReturn(mockContext);

        // 6. mock the inflater that is returned by LayoutInflater.from()
        when(LayoutInflater.from(mockContext)).thenReturn(mockInflater);

        // 7. pass anyInt() as a resource id to care of R.layout.fragment_news_view_holder in onCreateViewHolder()
        when(mockInflater.inflate(anyInt(), eq(mockParent), eq(false))).thenReturn(mockView);

        // call onCreateViewHolder() to act
        NewsViewHolder viewHolder = adapter.onCreateViewHolder(mockParent, dummyTestId);

        // OKAY straightfoward right?
        assertNotNull(viewHolder);

        // this is not very important but I recommend it,
        // it just returns the view sent to NewsViewHolder 
        // and verify it against the mockView that you inflated above
        assertEquals(viewHolder.getItemView(), mockView);
    }

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

如何在android中对这行LayoutInflater.from()进行单元测试 的相关文章

随机推荐

  • DomPDF 不能很好地渲染表格

    我正在尝试使用 DomPDF 获取 PDF 但遇到了一个奇怪的问题 所有数据和其他内容都很好 但当以 PDF 形式呈现时 表格的第一行总是过时 首先 我虽然表格可能会转到下一页 这会导致样式脱离上下文 但我尝试将表格限制为一页 发现问题仍然
  • 什么是好的 php 解析器生成器?

    我需要解析一种小的 迷你语言 用户可以在我的网站上输入它 我想知道 lex 和 jacc 或 antlr 在 php 世界中的对应部分是什么 I used PHP 的 LIME 解析器生成器 http sourceforge net pro
  • 将 Picasso 库与 ListView 一起使用

    我想做的是调整我的自定义 ListView 适配器以使用 Picasso 库从网络获取的图像 我相信我已经更改了适配器以便接受来自 Picasso 的图像 但我不确定如何更改我的实现以使用 ListView 接受它 我相信我必须访问hold
  • 如何通过扩展修改 Chrome 中的当前 url 位置

    我想创建一个扩展 如果用户单击扩展按钮 则将用户重定向到另一个网站 到目前为止 我只看到了为每次点击创建一个新选项卡的扩展 是否可以使用活动选项卡将用户重定向到另一个网站 我尝试过这样的事情 chrome browserAction onC
  • 简单的汇编代码会导致段错误吗?

    section data section text globl start start movl 1 eax this is the linux kernel command number system call for exiting a
  • C++0x 中的本地化支持有任何更新吗?

    我对 C 语言环境方面的研究越多 我就越了解 它们已经被破坏了 std time get 不对称std time put 如 C strftime strptime 中所示 并且不允许轻松解析带有 AM PM 标记的时间 I 发现 http
  • 在 C# 中按第一个元素的升序对二维数组行进行排序

    我需要按第一个元素的升序对二维数组行进行排序 如示例所示 5 7 6 2 9 6 4 8 1 gt 2 9 6 4 8 1 5 7 6 我可以在行中找到最大元素 但我现在不知道如何对行进行排序 public double maxInRow
  • PHP:get_used_class() 与 get_class($this)

    在 PHP 中 有什么区别get called class http php net manual en function get called class php and get class this http php net manua
  • SQLite 按小时、天、周、年进行分组/计数

    假设我们有一个简单的 Android 应用程序 只有一个按钮 单击该按钮记录该单击的日期和时间 在 sqlite 中 我想知道记录保存该日期时间的长串或字符串的最佳格式是什么 目的是制作报告来显示 1 选定日期的点击次数总和 按小时分组 2
  • 配置在 Eclipse 中为 Scala 运行

    我是 Scala 的初学者 我在 eclipse 中安装了 Scala IDE 现在我想运行我的应用程序 它从不显示 作为 Scala 应用程序运行 而是显示 作为 Java 应用程序运行 或 Java 小程序 我打开 运行配置 并单击 S
  • 使用 SSL/Keystore 连接到 Java 中的 Websphere MQ

    我想通过 Java 连接到 Websphere 6 0 MQ 我已经有了 普通 队列的工作代码 但现在我需要访问一个经过 SSL 加密 密钥库 的新队列 我收到了一个名为 Something jks 的文件 我认为它是我需要存储在某处的证书
  • html5中的
    标签可以用作背景图片吗?

    我开始阅读 html5 并且正在尝试开展一个项目 以便我可以了解事情是如何工作的 我知道标签可以这样使用
  • zsh:找不到命令:express

    我安装了node和npm并且都工作正常 但是 当我尝试通过安装 Express 时npm install g express I get zsh 找不到命令 express 我尝试在我的中添加各种路径 zshrc文件没有运气 如果我回声 p
  • 更改使用 catplot 或 barplot 创建的条形图的宽度

    我正在尝试使用seaborn factorplot 创建条形图 我的代码如下所示 import seaborn as sns import matplotlib pyplot as plt df pd read csv data csv f
  • 如何在 Dotrine 2 中配置命名策略

    我读了chapter http docs doctrine project org projects doctrine orm en latest reference namingstrategy html关于手册中的 Doctrine 命
  • Tkinter - 等重的列不等宽

    我有一个包含三列的 Tkinter 顶级窗口 所有三列均配置为具有相同的权重 内柱0 and 2是子框架 里面有Listbox小部件 内柱1是一组按钮 由于某种原因 尽管我的 3 列具有相同的权重 但这些列表框 强制 它们的列占用更多空间
  • mypy:“__eq__”与超类型“object”不兼容

    这是我的代码 class Person def init self id self id id def eq self other Person gt bool return self id other id def compare sel
  • 转换忽略 sf::Sprite 的起源

    在 SFML 中变换精灵 不考虑它的新原点 在我的例子中 sf Sprite 围绕左上角 0 0 的轴旋转 无论其原点如何 之前使用 setOrigin 设置新的原点无效 我确信精灵会更早地获得正确的原点位置 即矩形的中心 My code
  • UIGestureRecognizers 的多个手势(iPhone、Cocos2d)

    我使用 Cocos2d 渲染精灵 并使用 UIGestureRecognizers 允许用户平移 旋转和缩放精灵 我使用如下代码单独工作 UIPinchGestureRecognizer pinchRecognizer UIPinchGes
  • 如何在android中对这行LayoutInflater.from()进行单元测试

    您好 我正在构建一个简单的 RecyclerView 适配器 并尝试测试适配器的所有方法 但 onCreateViewHolder 对我来说很困难 Override public NewsViewHolder onCreateViewHol