无法使用 PowerMockito/Mockito 模拟 URL 类

2024-02-14

我正在尝试使用 PowerMockito 来模拟我正在测试的代码中 java.net.URL 类的创建。基本上,我想防止发生真正的 HTTP 请求,而是 1)在发出请求时检查数据,2)在模拟响应上提供我自己的测试数据。这就是我正在尝试的:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ URL.class, MockedHttpConnection.class })
public class Test {
    URL mockedURL = PowerMockito.mock(URL.class);
    MockedHttpConnection mockedConnection = PowerMockito.mock(MockedHttpConnection.class);

...
    PowerMockito.whenNew(URL.class).withParameterTypes(String.class).withArguments("MyURLString").thenReturn(mockedURL);
PowerMockito.when(mockedURL.openConnection()).thenReturn(mockedConnection);

...
}

我想要测试的代码如下所示:

URL wlInvokeUrl = new URL(wlInvokeUrlString);
connection = (HttpURLConnection) wlInvokeUrl.openConnection();

早些时候,在我的测试场景中,我模拟了 wlInvokeUrlString 以匹配“MyURLString”。我还尝试使用whenNew行的各种其他形式,尝试注入模拟。无论我尝试什么,它都不会拦截构造函数。我想要做的就是“捕获”对 openConnection() 的调用,并让它返回我的模拟 HTTP 连接而不是真实的连接。

我已经在同一脚本中模拟了在此之前的其他类,并且这些类按预期工作。要么我需要第二双眼睛(可能是真的),要么 URL 类有一些独特的东西。我确实注意到,如果我使用“whenNew(URL.class).withAnyArguments()”并将“thenReturn”更改为“thenAnswer”,我可以让它触发。唯一的问题是我从来没有得到我的代码的 URL 调用。我看到的是对 URL.class 的 3 参数构造函数的调用,参数全部为空。这个类是否来自 Java 运行时并由测试运行器引导?任何帮助深表感谢。


这是使用时常犯的错误PowerMockito.whenNew.

请注意,您必须准备创建 MyClass 新实例以进行测试的类,而不是 MyClass 本身。例如。如果执行 new MyClass() 的类被称为 X 那么你必须执行 @PrepareForTest(X.class) 才能让 whenNew 工作

From Powermock 维基 https://github.com/jayway/powermock/wiki/MockitoUsage#how-to-mock-construction-of-new-objects

所以,你需要稍微改变一下你的测试并添加到@PrepareForTest一个创建新实例的类URLlike:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ URL.class, MockedHttpConnection.class , ConnectionUser.class})
public class URLTest {
public class URLTest {

    private ConnectionUser connectionUser;

    @Before
    public void setUp() throws Exception {

        connectionUser = new ConnectionUser();
    }

    @Test
    public void testName() throws Exception {

        URL mockedURL = PowerMockito.mock(URL.class);
        MockedHttpConnection mockedConnection = PowerMockito.mock(MockedHttpConnection.class);

        PowerMockito.whenNew(URL.class).withParameterTypes(String.class).withArguments("MyURLString").thenReturn(mockedURL);
        PowerMockito.when(mockedURL.openConnection()).thenReturn(mockedConnection);

        connectionUser.open();

        assertEquals(mockedConnection, connectionUser.getConnection());


    }
}

where:

public class ConnectionUser {

    private String wlInvokeUrlString = "MyURLString";
    private HttpURLConnection connection;

    public void open() throws IOException {
        URL wlInvokeUrl = new URL(wlInvokeUrlString);
        connection = (HttpURLConnection) wlInvokeUrl.openConnection();
    }

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

无法使用 PowerMockito/Mockito 模拟 URL 类 的相关文章

随机推荐

  • jQuery 动态 qtip 显示 div,但每次鼠标悬停都会变得越来越慢

    我使用 jQuery qTip 插件来显示鼠标悬停链接 img 的 div 我写了两个选项来使用 但这两个选项都造成了麻烦 V1 第一个版本仅在我第二次将鼠标移到链接上时才显示工具提示 重复将鼠标悬停在链接上后 脚本似乎变得越来越慢 6 7
  • php unlink() 非ascii字符=找不到文件[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 简短 php unlink 正在处理名称为 asci 的文件 但是 如果我尝试删除名称包括 等的文件 则会出现取消链接生
  • 无法使用ajax从数据库获取数据

    我正在开发 ASP Net MVC 应用程序 我想使用ajax从数据库获取数据 它不会在网页中加载数据 控制台窗口上也没有错误 在 Visual Studio 中也不例外 以下是我的控制器代码 HttpGet public JsonResu
  • 如何使用 HTML 进行 Skype 通话?

    我尝试在我的脚本中插入以下代码片段 通过单击该链接 它应该会呼叫 Skype 帐户 我已经找了好几个小时了 但不明白为什么它不起作用 pre code lt a href quot callTo USERNAME quot gt lt im
  • 市场上的 Github Actions 可以做恶意的事情吗?

    我是 GitHub Actions 的绝对初学者 市场上有可用的操作 这些操作是否可以对我的存储库进行恶意操作 例如 删除我的仓库 将恶意代码提交到我的存储库中 从私人存储库复制内容 答案是 不幸的是 YES 您可以在这里找到一些参考 使用
  • 使用PHPExcel制作自动生成excel文件

    我想让我的 Excel 文件填充从数据库中获取的一些数据 例如某人的姓名和年龄 假设我的数据库中有 10 个人 我希望将这 10 个人包含在我的 Excel 文件中 所以基本上 你会得到 姓名年龄 人1 20岁 人2 25岁 等等 我知道如
  • JavaScript 函数返回 TYPE BOOLEAN 的变量名称,而不是模板文字中的值本身 [重复]

    这个问题在这里已经有答案了 javascript 中是否有一个函数 我可以将变量 而不是值 设置为像 parseVariableName 这样的字符串 例如 在我的场景中 我想要使用布尔变量有一个 动态类名不创建对象 将其作为数组并循环 我
  • 回形针不保存附件

    我是 Rails 和 Web 开发领域的新手 我已经创建了一个用户模型 现在我正在尝试让用户能够使用回形针添加个人资料图片 在我的用户显示页面中 用户可以单击链接打开 编辑 页面 从中可以看到要浏览的表单并选择要上传的图像 单击按钮时 它会
  • 从数据库读取和显示时,“应用程序启动方法中出现异常,java.lang.reflect.InitationTargetException”

    我正在尝试从 MySQL 数据库读取值并将其显示在 JavaFX 的表中 我使用netbeans IDE 当我运行代码时 我得到了标题中提到的异常 我将在下面发布代码 public class ViewSubject extends App
  • 使用 data.table R 选择行或列?

    假设我有一个 data table 例如 library data table RRR lt data table 1 15 runif 15 rgeom 15 0 5 rbinom 15 2 0 5 V1 V2 V3 V4 1 1 0 3
  • Android:MediaPlayer 视频宽高比问题

    我遇到一个无法解决的问题 我正在使用 MediaPlayer 类来播放视频 但是 我总是失去原始的纵横比 这里提到了媒体播放器代码和xml代码 我已经尝试了很多方法但仍然无法解决问题 我需要保持原始的宽高比 我已在 Android 清单文件
  • 按字母顺序排列的列表,轨道上有 ruby

    我正在构建一个按字母顺序排序的列表 并正在寻找一种解决方案来获取数据库结果并按字母顺序排序 任何帮助是极大的赞赏 在上面的nduks的基础上 我喜欢 公司 rb def initial return if name blank name 0
  • Firestore:文档父名称缺少“/”

    我正在使用 jest 对 firestore 执行集成测试 我期望收到包含等于 field1 和 field2 的字段的文档 但是 我收到了以下错误 我尝试在 firecase 控制台中创建复合索引 但问题仍然存在 这种情况似乎只在测试期间
  • Django:分配外键 - 无法获取类的代表

    我在这里问这个问题是因为 在我的搜索中 这个错误通常与查询有关 而不是与外键分配有关 我收到的错误发生在模型的方法中 这是代码 class Deal models Model model fields def update existing
  • 为什么 Node.js 异步模块在使用 async.eachLimit(array, limit, function, callback) 的第一步后停止?

    如果我使用这段代码 async eachLimit body photos photo 10 function photo var flickr getphoto path request get url flickr host url f
  • 从命令行检测 Apple Silicon

    如何从 shell 脚本中检测到它正在 M1 Apple 硬件上运行 我希望能够运行命令行命令 以便我可以编写if 其主体仅在具有 M1 处理器的 Mac 上运行时才会执行 当然至少是 macOS Big Sur uname m 将返回ar
  • CMake找不到NVIDIA的opencl sdk

    我刚刚安装了 NVIDIA CUDA 工具套件 用它在 Windows 8 1 上开发 OpenCL 应用程序 我遇到了一些问题 1 FinedOpenCl cmake 不起作用 因为 Nvidia 工具包未设置 opencl dir cm
  • PHP:XML 文件到字符串,使用 asXML() 的 file_get_contents 或 simplexml_load_file 更快

    我正在编写一个代理服务来缓存我的移动应用程序对网络服务进行的查询 就像中间的一个人 我构建的代理站点的任务是将其从应用程序获取的查询传递到第三方 Web 服务 并将来自第三方 Web 服务的响应保存为 XML 文件 并为同一查询的所有后续调
  • 隐式类型转换优先级是如何确定的?

    这是代码 class A public int val char cval A val 10 cval a operator char const return cval operator int const return val int
  • 无法使用 PowerMockito/Mockito 模拟 URL 类

    我正在尝试使用 PowerMockito 来模拟我正在测试的代码中 java net URL 类的创建 基本上 我想防止发生真正的 HTTP 请求 而是 1 在发出请求时检查数据 2 在模拟响应上提供我自己的测试数据 这就是我正在尝试的 R