PowerMockito - 如何将whenNew()与类型化列表一起使用?

2024-01-08

我希望 PowerMockito 返回我的空数组列表Foos when new ArrayList<Foo>()被调用,但我不确定如何构造该语句。具体来说,我想要new ArrayList<AnyOtherType>()像往常一样创建一个新列表。

ArrayList<Foo> fooList = new ArrayList<Foo>();
PowerMockito.whenNew(ArrayList.class).withParameterTypes(Foo.class).thenReturn(fooList);

^ 这基本上是我所拥有的,但是.withParameterTypes(Foo.class)不允许我跟随.thenReturn()。我唯一的选择是withArguments(firstArgument, additionalArguments).

使用 PowerMock 可以实现这一点吗?如果可以,我该如何构建它?

EDIT:

好的,根本问题是我需要获取我要测试的方法的结果,但我必须模拟该请求,并且该列表放置在我要测试的方法末尾的请求中。

inspectionAction.viewInspectionDetailsAjax(mapping, form, request, response);

此方法从请求中提取几个参数,该参数是模拟的(Mockito.mock(HttpServletRequest.class);)。通常在我们的应用程序中,我们将数据放置在会话级变量上。但由于该方法会被同时调用多次,并且结果会被ajax到页面中,因此每条数据都存储在请求中:

request.setAttribute("inspectionAjaxDetails", details);

所以我需要一些方法来获得details,这是一个类型化的 ArrayList,当request被嘲笑。


简短的回答是:你不能。正如 Matt Lachman 在评论中指出的那样,您无法捕获类型的泛型,因此您无法获得List<Foo>也没有得到List<Bar> and List<AnyOtherType>。由于集合的使用如此频繁,因此尝试使用 PowerMock 捕获它们几乎总是一个坏主意。

就我而言,我需要获取一个提供给模拟对象的列表HttpServletRequest作为属性(映射<String, Object>)在我试图测试的方法中。我必须找到不同的解决方案。就我而言,它是创建一个非匿名实现Answer我可以在该方法运行后检索值。我的 Mockito 调用如下所示:

RequestAnswer requestAnswer = new RequestAnswer();

Mockito.doAnswer(requestAnswer).when(request).setAttribute(Matchers.anyString(), Matchers.anyObject());

ArrayList<Foo> details = (ArrayList<Foo>) requestAnswer.getAttribute("foo");

我的 RequestAnswer 类实现Answer<Object>,它最重要的方法如下所示:

@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
    Object[] args = invocation.getArguments();
    String methodName = invocation.getMethod().getName();
    if ("setAttribute".equals(methodName)) {
        String key = (String) args[0];
        Object value = args[1];
        attributes.put(key, value);
    } else if ("getAttribute".equals(methodName)) {
        String key = (String) args[0];
        return attributes.get(key);
    } else if ("getParameter".equals(methodName)) {
        String key = (String) args[0];
        return parameters.get(key);
    }
    return null;
}

剩下的只是一些 Maps 以及 getter 和 setter。

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

PowerMockito - 如何将whenNew()与类型化列表一起使用? 的相关文章

随机推荐

  • 如何创建一个 Android 应用程序,当用户正在玩另一个应用程序时,可以捕获全局触摸屏事件?

    正如标题所说 在我的研究中 我需要记录用户触摸屏事件 主要是用户使用另一个应用程序时的手势 例如点击 滚动 滑动等 目前我想不出一个好的方法 Android 4 x 好像无法读取触摸屏事件 有人知道捕获触摸事件的好方法吗 我还花了相当长的时
  • 使用 JavaScript 将选定的文本复制并粘贴到剪贴板

    我正在为我的系统构建一个自定义右键菜单 我需要知道如何制作一个 JavaScript 函数来复制所选文本 基本上 100 就像原来的右键菜单一样 我知道 Flash 的解决方法 我想在 JavaScript 中做到这一点 到目前为止 我看到
  • django 有什么好的 User-Agent 解析插件

    有没有可以推荐的 User Agent String 解析插件或中间件 现在我正在使用django smartagent http pypi python org pypi django smartagent 0 1 1 但它的词典并不完整
  • 单独通过 @Value 注入属性映射

    如何使用 Values注解 无需在 applicationContext xml 中定义任何内容或任何其他 XML 文件 我使用的是 spring boot 它没有anyXML 文件 我也不想要任何 XML 文件 所以请不要告诉我在 XML
  • SwiftUI 禁用列表边框 iOS 14 [重复]

    这个问题在这里已经有答案了 我发现如果视图包含 navigationView SwiftUI iOS 14 中的列表将具有类似边框的内容 有什么解决办法可以禁用边框吗 因为边框破坏了我的应用程序的设计 这是代码中不包含 Navigation
  • Laravel 队列被“杀死”

    有时 当我将大型数据集发送到作业时 我的队列工作人员会突然退出 taskmetas is an array with other arrays each subsequent array having 90 properties this
  • 为什么trickle 实用程序不会影响我的动态链接golang 程序?

    我有一个 golang 程序 可以通过 https 将大量数据上传到 OpenStack 对象存储 它依赖于golang标准库 net http 做这项工作 我想用trickle https linux die net man 1 tric
  • 如何在express中为静态文件设置动态路由

    目前 为了提供静态文件 我正在执行以下操作 app use express static dirname public then i start the server http createServer app listen port fu
  • Swift 中的 GCDAsyncSocket

    我想使用基于 ELM327 芯片的 OBD 加密狗打开 TCP 连接 所以我决定使用GCDAsyncSocket库 我写了这段代码 import UIKit import CocoaAsyncSocket class ViewControl
  • JavaScript 如何通过单击和拖动动态移动 Div

    好吧 看起来应该很简单 我需要获取一个已经存在的 div 并根据窗口内的鼠标位置移动它 我到处搜索 这导致我以过于复杂的方式做同样的事情 并且涉及到 j query 的使用 我需要严格使用 javascript 来完成我想做的事情 Meth
  • pyqt 按钮自动绑定到 on...click 函数,无需 connect 或 pyqtSlot

    我已经使用 pyqt5 和 qt designer 几个星期了 我习惯使用 connect 语句将信号连接到处理函数 昨天我编写了一段代码 它还自动将按钮单击信号连接到处理函数 而无需 pyqtSlot 装饰器 将单击的信号连接到函数会导致
  • 缺少 JavaFX 应用程序类

    我有这样的java代码 package mypackage import javafx application Application import javafx stage Stage public class MyApp extends
  • 创建函数App时出现“该区域不允许进行缩放操作”的错误

    我正在运行构建中的各个步骤Azure 中的无服务器 Web 应用程序 https learn microsoft com en us azure functions tutorial static website serverless ap
  • gzip/deflate 失败时抛出异常

    我在 ASP NET MVC 3 中的 gzip deflate ActionFilterAttribute 中遇到了一个有趣的问题 如果我的应用程序抛出异常 我不会得到 YSOD 而是得到一整页的乱码 如下所示 I m J J t iG
  • 如何删除网格布局小部件内的所有小部件并以相同的顺序重新创建所有小部件

    这是我之前的问题的延续 如何从左上角开始将小部件添加到网格布局 谢谢X Jacobs解决 tat 问题 现在我想删除所有这些小部件并以相同的顺序重新创建相同的小部件 就像刷新小部件库一样 谢谢 好的 这是我的 ui 当我单击 createP
  • 如何从包名称中获取应用程序的图标?

    我尝试了堆栈溢出的各种解决方案 但没有成功 我想要的是 我知道不同应用程序的包名称 我想从这些包名称中获取应用程序图标 在图像视图中显示这些图标 例如我有一个包名com example testnotification 如何获取此应用程序图
  • jQuery 单击停止传播

    我有一个简单的设置 一个表格 其单元格内有复选框 我有两个事件 一个事件响应单击复选框 另一个事件响应单击 tr 元素 当我单击复选框时 我不希望触发表行事件 我试过了event stopPropagation and return fal
  • 文本框的实时绑定属性更改[重复]

    这个问题在这里已经有答案了 我有一个TextBox控件绑定到我的视图模型中的属性 当前行为的工作方式是视图模型只会收到通知 其中的文本TextBox控件失去焦点后进行修改 每当TextBox实时改变状态 它附加到我的视图模型中的一个属性 用
  • 如何将键值对附加到 iPhone 上的 UIView?

    当我开始 iPhone 开发时 我在某处读到可以将键值对附加到 UIView 我知道所有 UIView 都可以用作字典来存储您可能想要附加到它们的任何数据 以防止不必要的子类化 然而 我到处寻找参考 并尝试自己实现该行为 但徒劳无功 我尝试
  • PowerMockito - 如何将whenNew()与类型化列表一起使用?

    我希望 PowerMockito 返回我的空数组列表Foos when new ArrayList