如何通过 Mockito 对被测类的私有方法进行存根

2024-01-11

假设我们有一个名为 SomeClass 的 java 类

public class SomeClass {

    private boolean isMethod() {

        return false;
    }

    public void sendRequest(String json, String text) {

        int messageId;

        if (isMethod()) {
            messageId = getMessageId(json);
            sendMessage(messageId, text);
        } else {
            throw new IllegalArgumentException();
        }
    }

    private void sendMessage(int messageId, String text) {

    }

    private int getMessageId(String text) {

        Pattern p = Pattern.compile("messageId=(\\d+)&");
        Matcher m = p.matcher(text);

        if (m.find()) {
            return Integer.valueOf(m.group(1));
        }
        return 0;
    }
}

不要注意方法的名称,它们都是可选的。

  • 我想测试sendRequest(String json, String text)隔离方法。
  • 我想存根方法isMethod() and getMessageId(json),并验证sendMessage(messageId, text)方法被调用。
  • 我需要确定getMessageId(json)返回 25 并且isMethod()无论给定哪个参数值都返回 true。

这可以通过PowerMockito框架来实现。

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

@RunWith(PowerMockRunner.class)
@PrepareForTest(SomeClass.class)
public class SomeClassTest {

    private SomeClass someInstance;

    @Before
    public void setUp() throws Exception {

        someInstance = PowerMockito.spy(new SomeClass());
    }

    @Test
    public void sendRequest() throws Exception {

        String json = "JSON";
        String text = "Some text";
        int messageId = 1;

        PowerMockito.doReturn(true).when(someInstance, "isMethod");
        PowerMockito.doReturn(messageId).when(someInstance, "getMessageId", json);

        someInstance.sendRequest(json, text);

        PowerMockito.verifyPrivate(someInstance).invoke("isMethod");
        PowerMockito.verifyPrivate(someInstance).invoke("getMessageId", json);
        PowerMockito.verifyPrivate(someInstance).invoke("sendMessage", messageId, text);
    }

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

如何通过 Mockito 对被测类的私有方法进行存根 的相关文章

  • Android:如何暂停和恢复可运行线程?

    我正在使用 postDelayed 可运行线程 当我按下按钮时 我需要暂停并恢复该线程 请任何人帮助我 这是我的主题 protected void animation music6 music4 postDelayed new Runnab
  • java程序有多少种结束方式?

    我知道使用 System exit 0 可以结束一个java程序 例如 如果我有一个JFrame窗口 它会关闭并结束程序 但我想知道还有多少其他方法 可以关闭它并结束程序 包括发生错误时 程序会被关闭 JFrame也会被关闭吗 添加到其他答
  • 非易失性领域的出版与阅读

    public class Factory private Singleton instance public Singleton getInstance Singleton res instance if res null synchron
  • 如何以编程方式使用包含多列的 where-in 子句执行 PostgreSQL 查询?

    我的查询是这样的 select from plat customs complex where code t code s in 01013090 10 01029010 90 它在 psql 控制台中运行良好 我的问题是如何在客户端代码中
  • Java 中的 <-- 是什么? [复制]

    这个问题在这里已经有答案了 我遇到了下面的片段 它输出到4 3 2 1 我从来没有遇到过 lt 在爪哇 Is lt 使 var1 的值变为 var2 的运算符 public class Test public static void mai
  • 自定义列表字段点击事件

    我正在编写一个应用程序 其中我创建了用于显示列表视图的自定义列表字段 我的 CustomListField 包含连续的一个图像和文本 我正在通过单击列表字段行获取字段更改侦听器 但我也想将字段更改侦听器放在图像上 谁能告诉我我该怎么做 这是
  • 为什么用scala写的代码比用java写的慢6倍?

    我不确定我在编写 scala 代码时是否犯了一些错误 问题是 The four adjacent digits in the 1000 digit number that have the greatest product are 9 9
  • 使用 OkHttp 下载损坏的文件

    我编写的下载文件的方法总是会产生损坏的文件 public static String okDownloadToFileSync final String link final String fileName final boolean te
  • JOOQ 忽略具有默认值的数据库列

    看来JOOQ完全忽略了数据库列的默认值 既不会更新 ActiveRecord 对象 也不会在 INSERT 时跳过此列 相反 它尝试将其设置为 NULL 这在 NOT NULL 列上失败 Example CREATE TABLE bug f
  • getCurrentSession 在网络中休眠

    我正在使用 hibernate 和 jsp servlet 编写一个基于 Web 的应用程序 我读过有关sessionFactory getCurrentSession and sessionFactory openSession方法 我知
  • JAXB - 忽略元素

    有什么方法可以忽略 Jaxb 解析中的元素吗 我有一个很大的 XML 文件 如果我可以忽略其中一个大而复杂的元素 那么它的解析速度可能会快很多 如果它根本无法验证元素内容并解析文档的其余部分 即使该元素不正确 那就更好了 例如 这应该只生成
  • 2^31 次方的 Java 指数错误 [重复]

    这个问题在这里已经有答案了 我正在编写一个java程序来输出2的指数幂 顺便说一句 我不能使用Math pow 但是在 2 31 和 2 32 处我得到了其他东西 另外 我不打算接受负整数 My code class PrintPowers
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • UseCompressedOops JVM 标志有什么作用以及何时应该使用它?

    HotSpot JVM 标志是什么 XX UseCompressedOops我应该做什么以及什么时候使用它 在 64 位 Java 实例上使用它 与不使用它 时 我会看到什么样的性能和内存使用差异 去年大多数 HotSpot JVM 都默认
  • 使用 Proguard 通过 Dropbox.com 库混淆 Android 应用程序

    我刚刚创建了一个需要 Dropbox com API 库的 Android 应用程序 我现在尝试在 发布 模式下构建应用程序 并希望在代码上运行混淆器以对其进行混淆 但是 每当我尝试运行 Proguard 时 都会收到以下错误 Progua
  • 按降序排序映射java8 [重复]

    这个问题在这里已经有答案了 private static
  • Tomcat 6 未从 WEB-INF/lib 加载 jar

    我正在尝试找出我的 tomcat 环境中的配置问题 我们的生产服务器正在运行 tomcat 安装并从共享 NFS 挂载读取战争 然而 当我尝试使用独立的盒子 及其配置 进行同样的战争时 我收到下面发布的错误 有趣的是 如果我将 WEB IN
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • 用于请求带有临时缓存的远程 Observable 的 RxJava 模式

    用例是这样的 我想暂时缓存最新发出的昂贵的Observable响应 但在它过期后 返回到昂贵的源Observable并再次缓存它 等等 一个非常基本的网络缓存场景 但我真的很难让它工作 private Observable
  • 使用 DBCP 配置 Tomcat

    在闲置一段时间 几个小时 后 我们收到了 CommunicationsException 来自 DBCP 错误消息 在异常中 位于这个问题的末尾 但我没有看到任何配置文件中定义的 wait timeout 我们应该看哪里 在 tomcat

随机推荐

  • 如何从 IntelliJ / PyCharm 中删除材质主题(或重置为默认值)?

    我已经安装了 Material Theme UI 它使我的 IDE 变黑 后来我决定删除并删除插件 不幸的是 这并没有恢复默认颜色 IDE 的某些部分 例如项目窗格 仍然是黑色的 如何恢复 如何从 IntelliJ PyCharm 中删除材
  • Mac OS X Python GUI 管理员提示符

    我有一个 OS X Python 应用程序 它使用 wxPython 作为 GUI 控件 我希望在启动网络服务之前提示用户获得管理权限 类似于使用 Objective C 中的授权服务 API 我发现的最接近的图书馆是 Bob Ippoli
  • android 解码资源为 xml 位图返回 null - API 级别 7

    我有一个奇怪的情况 将我的 PNG 从 drawable hdpi 移动到 drawable 并将 XML 位图放入 drawable hdpi 后 我无法使用以下命令解码这些位图BitmapFactory decodeResource 方
  • Gnuplot 极坐标直方图

    我有一个数据文件file dat平面上的点有三列 无线电 角度 温度 我想使用极坐标和颜色图将此数据绘制为直方图 如下图所示 但使用 gnuplot 我可以创建一个histogram dat文件包含我想要的 bin 的值 但我不知道如何在
  • python中两个列表的排列

    我有两个列表 例如 list1 square circle triangle list2 red green 我如何创建这些列表的所有排列 如下所示 squarered squaregreen redsquare greensquare c
  • 如果满足条件,pandas 将值从一列复制到另一列

    我有一个数据框 df col1 col2 col3 1 2 3 1 4 6 3 7 2 我要编辑df 这样当 col1 的值小于 2 时 从col3 所以我会得到 new df col1 col2 col3 3 2 3 6 4 6 3 7
  • 如何基于二值掩模裁剪图像

    我使用 torch 和一些语义分割算法来生成分割图像的二进制掩码 然后我想根据该蒙版裁剪图像 为了清楚起见 我需要在每个像素的基础上裁剪它 这似乎是一个简单的问题 但我能想到的唯一解决方案是反转draw mask类似于 Coco API 中
  • 为什么多次调用 app.UseEndpoints(..) 时中间件不执行?

    我遇到过由于多次调用而跳过中间件的情况app UseEndpoints Looking at this startup code I would expect SetUser middleware to be executed before
  • vc++10中模板私有继承不可访问

    以下代码使用 GCC 4 4 6 和 Comeau 4 3 10 进行编译 include
  • andThen 对于 Scala 中两个参数的函数

    假设我有两个函数f and g val f Int Int gt Int val g Int gt String 现在我想用andThen得到一个函数h val h Int Int gt String f andThen g 不幸的是它无法
  • 我应该验证 JWT 两次(在 API 网关和服务本身中)吗?

    我目前正在为我们的服务设置 API 网关 API 网关处理令牌验证 通过 OpenID Connect 仅当令牌有效时 请求才会路由到目标后端服务 然后我还应该在后端服务本身中验证令牌吗 该服务需要令牌中的信息来修改数据库查询 仅读取允许用
  • Google Places API 地点描述/摘要

    使用 Google Places API 我似乎无法通过 附近的搜索 或 详细信息搜索 获得某个地点的描述 请查看附图 了解我想要从 JSON 中提取的内容 这些信息一定来自某个地方 只是哪里的问题 Example Picture http
  • 在弹出窗口中隐藏栏地址(chrome)[重复]

    这个问题在这里已经有答案了 我正在寻找这个 但找不到解决方案 我正在使用以下命令打开一个弹出窗口 window open url title toolbar no location no directories no status no m
  • 导致长度不等于 1 或 dplyr 中组长度的分组操作

    我不确定使用哪个函数来执行以下操作 library data table dt data table a 1 4 b 1 2 dt rep a 1 3 by b b V1 1 1 1 2 1 1 3 1 1 4 2 2 5 2 2 6 2
  • 在javascript中将32位整数转换为4字节数据

    我被要求将整数转换为 32 位二进制数 所以被使用integer toString 2 并得到所需的0和1的32位二进制格式的值 但实际上我被要求做的是将整数转换为 4 字节的数据 我无法按照建议获得输出 我用过integer toStri
  • RxJSpublishReplay 与publishLast

    我正在 Angular 应用程序中实现缓存 HTTP 结果 据我所知 以下代码均有效 但我需要知道它们是否正在执行exactly同样的事情 或者我错过了一些重要的事情 发布最后 getPosts if this posts this pos
  • 如何将进度条模块与 urlretrieve 一起使用

    My pyhton3脚本使用以下命令通过互联网下载大量图像网址检索 我想添加一个进度条完成百分比 and 下载速度对于每次下载 The 进度条 http progressbar 2 readthedocs io en latest 模块似乎
  • 您使用什么设置进行 SharePoint (WSS/MOSS) 开发? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我很想知道其他 SharePoint 开发人员如何设置他们的开发工作站 我当前的设置 带有 Server 2008 的桌面 仅适用于 Hyper
  • “group”列以某种方式导致语法错误

    我不断收到此错误 您的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解在第 1 行 附近使用的正确语法 我知道我的 组 字段有问题 因为如果我删除它 我的表就会更新 没有任何问题 这是我的表单代码
  • 如何通过 Mockito 对被测类的私有方法进行存根

    假设我们有一个名为 SomeClass 的 java 类 public class SomeClass private boolean isMethod return false public void sendRequest String