模拟正在测试的同一类中的私有方法

2024-03-19

我有一个名为的 Java 类,MyClass,我想用 JUnit 进行测试。公共方法,methodA,我想测试调用私有方法,methodB,在同一个类中确定要遵循哪个条件路径。我的目标是为不同路径编写 JUnit 测试methodA。还,methodB调用服务,因此我不希望在运行 JUnit 测试时实际执行它。

最好的嘲笑方式是什么methodB并控制它的返回,以便我可以测试“方法”的不同路径?

我在编写模拟时更喜欢使用 JMockit,因此我对适用于 JMockit 的任何答案特别感兴趣。

这是我的示例类:

public class MyClass  {

    public String methodA(CustomObject object1, CustomObject object2)  {

        if(methodB(object1, object2))  {
            // Do something.
            return "Result";
        }

        // Do something different.
        return "Different Result";

    }

    private boolean methodB(CustomObject custObject1, CustomObject custObject2)  {

        /* For the sake of this example, assume the CustomObject.getSomething()
         * method makes a service call and therefore is placed in this separate
         * method so that later an integration test can be written.
         */
        Something thing1 = cobject1.getSomething();
        Something thing2 = cobject2.getSomething();

        if(thing1 == thing2)  {
            return true;
        }
        return false;
    }

}

这是我到目前为止所拥有的:

public class MyClassTest  {
    MyClass myClass = new MyClass();

    @Test
    public void test_MyClass_methodA_enters_if_condition()  {
        CustomObject object1 = new CustomObject("input1");
        CustomObject object2 = new CustomObject("input2");

        //  How do I mock out methodB here to return true?

        assertEquals(myClass.methodA(object1, object2), "Result");
    }

    @Test
    public void test_MyClass_methodA_skips_if_condition()  {
        CustomObject object1 = new CustomObject("input1");
        CustomObject object2 = new CustomObject("input2");

        //  How do I mock out methodB here to return false?

        assertEquals(myClass.methodA(object1, object2), "Different Result");
    }

}

Thanks!


给出您要求的答案(使用 JMockit 的部分模拟):

public class MyClassTest
{
    @Tested MyClass myClass;

    @Test
    public void test_MyClass_methodA_enters_if_condition() {
        final CustomObject object1 = new CustomObject("input1");
        final CustomObject object2 = new CustomObject("input2");

        new NonStrictExpectations(myClass) {{
            invoke(myClass, "methodB", object1, object2); result = true;
        }};

        assertEquals("Result", myClass.methodA(object1, object2));
    }

    @Test
    public void test_MyClass_methodA_skips_if_condition() {
        final CustomObject object1 = new CustomObject("input1");
        final CustomObject object2 = new CustomObject("input2");

        new NonStrictExpectations(myClass) {{
            invoke(myClass, "methodB", object1, object2); result = false;
        }};

        assertEquals("Different Result", myClass.methodA(object1, object2));
    }
}

不过,我愿意not建议这样做。一般来说,private方法不应该被嘲笑。相反,模拟被测单元的实际外部依赖关系(CustomObject在这种情况下):

public class MyTestClass
{
    @Tested MyClass myClass;
    @Mocked CustomObject object1;
    @Mocked CustomObject object2;

    @Test
    public void test_MyClass_methodA_enters_if_condition() {
        new NonStrictExpectations() {{
            Something thing = new Something();
            object1.getSomething(); result = thing;
            object2.getSomething(); result = thing;
        }};

        assertEquals("Result", myClass.methodA(object1, object2));
    }

    @Test
    public void test_MyClass_methodA_skips_if_condition() {
        new NonStrictExpectations() {{
            object1.getSomething(); result = new Something();
            object2.getSomething(); result = new Something();
        }};

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

模拟正在测试的同一类中的私有方法 的相关文章

  • 有没有创建 Cron 表达式的 Java 代码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要一个 Java 代码来根据用户输入创建一个 cron 表达式 用户输入是时间 频率和执行次数 只需从评论中添加 自己创建 即可
  • TreeMap 删除所有大于某个键的键

    在项目中 我需要删除键值大于某个键的所有对象 键类型为Date 如果重要的话 据我所知TreeMapJava中实现的是红黑树 它是一种二叉搜索树 所以我应该得到O n 删除子树时 但除了制作尾部视图并一一删除之外 我找不到任何方法可以做到这
  • 垃圾收集器如何在幕后工作来收集死对象?

    我正在阅读有关垃圾收集的内容 众所周知 垃圾收集会收集死亡对象并回收内存 我的问题是 Collector 如何知道任何对象已死亡 它使用什么数据结构来跟踪活动对象 我正在研究这个问题 我发现GC实际上会跟踪活动对象 并标记它们 每个未标记的
  • Android:文本淡入和淡出

    我已阅读此 stackoverflow 问题和答案 并尝试实现文本淡入和淡出 Android中如何让文字淡入淡出 https stackoverflow com questions 8627211 how to make text fade
  • Thymeleaf 3 Spring 5 映射加载字符串而不是 HTML

    我正在尝试将 Spring 5 和 Thymeleaf 3 一起配置 我正在 Eclipse 上工作 我使用 全新安装 构建并使用 springboot run 运行应用程序 我已经设置了一个控制器和几个模板 但 Thymeleaf 似乎找
  • 提供节点名或服务名,或未知 Java

    最近我尝试运行我的 Java 项目 每当我运行它并将其打开到我得到的服务器地址时 Unable to determine host name java net UnknownHostException Caused by java net
  • 在 Java 中如何找出哪个对象打开了文件?

    我需要找出答案哪个对象在我的 Java 应用程序中打开了一个文件 这是为了调试 因此欢迎使用工具或实用程序 如果发现哪个对象太具体了 这class也会很有帮助 这可能很棘手 您可以从使用分析器开始 例如VisualVM http visua
  • 如何检查某个元素是否存在于一组项目中?

    In an ifJava中的语句如何检查一个对象是否存在于一组项目中 例如 在这种情况下 我需要验证水果是苹果 橙子还是香蕉 if fruitname in APPLE ORANGES GRAPES Do something 这是一件非常微
  • 如何在 Spring 中使 @PropertyResource 优先于任何其他 application.properties ?

    我正在尝试在类路径之外添加外部配置属性资源 它应该覆盖任何现有的属性 但以下方法不起作用 SpringBootApplication PropertySource d app properties public class MyClass
  • 如何使用 JMagick 转换色彩空间?

    如何使用 JMagick API 转换色彩空间 例如 CMYK gt RGB 和 RGB gt CMYK None
  • Jetty、websocket、java.lang.RuntimeException:无法加载平台配置器

    我尝试在 Endpoint 中获取 http 会话 我遵循了这个建议https stackoverflow com a 17994303 https stackoverflow com a 17994303 这就是我这样做的原因 publi
  • 如何区分从 Saxon XPathSelector 返回的属性节点和元素节点

    给定 XML
  • Java Swing - 如何禁用 JPanel?

    我有一些JComponents on a JPanel我想在按下 开始 按钮时禁用所有这些组件 目前 我通过以下方式显式禁用所有组件 component1 setEnabled false 但是有什么办法可以一次性禁用所有组件吗 我尝试禁用
  • 使用 HtmlUnit 定位弹出窗口

    我正在构建一个登录网站并抓取一些数据的程序 登录表单是一个弹出窗口 所以我需要访问这个www betexplorer com网站 在页面的右上角有一个登录链接 写着 登录 我单击该链接 然后出现登录弹出表单 我能够找到顶部的登录链接 但找不
  • 手动设置Android Studio的JDK路径

    如何为 Android Studio 使用自定义 JDK 路径 我不想弄乱 PATH 因为我没有管理员权限 是否有某个配置设置文件允许我进行设置 如果您查看项目设置 您可以从那里访问 jdk 在标准 Windows 键盘映射上 您可以在项目
  • Hibernate 本机查询 - char(3) 列

    我在 Oracle 中有一个表 其中列 SC CUR CODE 是 CHAR 3 当我做 Query q2 em createNativeQuery select sc cur code sc amount from sector cost
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • Java RMI - 客户端超时

    我正在使用 Java RMI 构建分布式系统 它必须支持服务器丢失 如果我的客户端使用 RMI 连接到服务器 如果该服务器出现故障 例如电缆问题 我的客户端应该会收到异常 以便它可以连接到其他服务器 但是当服务器出现故障时 我的客户端什么也
  • 抛出 Java 异常时是否会生成堆栈跟踪?

    这是假设我们不调用 printstacktrace 方法 只是抛出和捕获 我们正在考虑这样做是为了解决一些性能瓶颈 不 堆栈跟踪是在构造异常对象时生成的 而不是在抛出异常对象时生成的 Throwable 构造函数调用 fillInStack
  • java'assert'和'if(){}else exit;'之间的区别

    java和java有什么区别assert and if else exit 我可以用吗if else exit代替assert 也许有点谷歌 您应该记住的主要事情是 if else 语句应该用于程序流程控制 而assert 关键字应该仅用于

随机推荐

  • 如何使用 jQuery 隐藏 IE 中损坏的图像?

    我尝试过从 jQuery 站点复制的这段代码 但它在 IE7 IE8 中失败 但在其他浏览器中有效 这段代码有什么问题 它来自 jQuery 站点 http api jquery com error 我正在使用 jQuery 版本 1 4
  • 移动端和网络服务器之间的数据同步

    您将如何实施数据同步解决方案来确保移动设备和 Web 服务器上的数据同步 看看这个教程 part one http www raywenderlich com 15916 how to synchronize core data with
  • 我如何判断 CEDET 是否使用 GNU Global?

    我让 CEDET 在 emacs 24 2 上大部分工作 并使用 bzr 的最新版本 存储库 当我搜索符号或定义时 我看到 cedet 迷你缓冲区 显示解析大量文件 其中一些文件不作为头文件 文件 没有任何对我正在搜索的符号的引用 我将让
  • 确保客户端上的文件状态与 NFS 服务器同步

    我正在尝试找到正确的方法来处理 NFS 客户端上的过时数据 考虑以下场景 两台服务器挂载具有多个文件的相同 NFS 共享存储 1 台服务器上的客户端应用程序删除了一些文件 2 个服务器上的客户端应用程序尝试访问已删除的文件并失败并显示 陈旧
  • Mongoid 在 ruby​​ 1.9.3 上失败

    所以我正在玩 mongo 的东西 创建了一个新的heroku应用程序 为其添加了一个mongolab选项 但是每个mongoid方法都失败了 我用谷歌搜索了一下 看起来这个问题在 1 9 3 之前的 ruby 中很常见 但我正在运行 1 9
  • 从文件夹中获取给定扩展名的第一个文件

    我需要获取具有以下内容的文件夹中的第一个文件 tar gz扩大 我想出了 FILE path to folder ls path to folder grep tar gz head 1 但我觉得它可以做得更简单 更优雅 有更好的解决方案吗
  • 在 D3.JS 中使用面积图启动过渡和动画

    我想让面积图在程序开始时从左到右 绘制 本身 我的图表中已经有一条线执行此操作 但是我无法使该线下方的区域正确设置动画 或者在页面首次启动时 绘制 自身 目前 这就是我所在地区的情况 var area d3 svg area x funct
  • 如何只为模态体放置滚动条?

    我有以下元素 div class modal div class modal dialog style max height 85 margin top 50px margin bottom 50px div class modal con
  • 新版本的 Minikube 不允许 Pod 使用自己的服务

    我有一个 Pod 偶尔需要通过自己的主机名来调用自己 我设置了一个部署 最终创建了 Pod 和一个服务 我可以使用集群中不同 Pod 的服务名称 但该 Pod 无法使用其主机名调用自身 这适用于 Minikube v0 17 1 和 Kub
  • 在实例变量中保存块

    我们如何声明一个全局 私有实例变量 来接受其中的块 我们是否需要综合它以及它对内存管理的影响是什么 我有一个从第三方方法收到的块 我想将其保存在实例变量中并在稍后阶段使用它 这是一个 无 ARC 示例 在后台完成一些工作后存储完成回调的块
  • 使用 INPUT 标签的 VALUE 属性(及其值)读取 HTML 表单的innerHTML

    我有一个html form与一些输入字段 而不是读取和发送值input字段由document ipForm userName value 我需要将整个 html 内容发送到 html 解析器并提取
  • StackPanel 逆序 - WPF

    我试图反转子项在 StackPanel 中出现的顺序 我希望能够将新的子项 在运行应用程序时 添加到列表的顶部而不是底部 我尝试过使用各种 XAML 代码 但没有任何效果 做到这一点最简单的方法是什么 Use stackPanel Chil
  • 在 Java 中声明 LinkedList

    当我们声明我们应该做的集合时 我总是学到 Interface ob new Class 如果我想使用例如 LinkedList 我会这样做List ob new LinkedList 但是我无法访问 LinkedList 中的所有方法 不是
  • 标准中关于指针比较的奇怪措辞

    6 5 8 6 http www open std org jtc1 sc22 wg14 www docs n1570 pdf 关于 gt 如果表达式 P 指向数组对象的一个 元素并且 表达式 Q 指向同一个数组对象的最后一个元素 指针表达
  • HTA 如何获取当前用户的用户名?

    我想获取当前用户的用户名 然后在我的应用程序名称中创建一个链接 该链接看起来像 http localhost id username I tried Dim objNetworkSet objNetwork CreateObject WSc
  • 如何使用 char 作为 switch-case 中的 case?

    如何在 switch case 中使用字符 我将收到用户输入的任何第一个字母 import javax swing public class SwitchCase public static void main String args St
  • 如果文本字段为空,则更改按钮元素的样式

    我想改变风格 postBtn if textfield是空的 就像 postBtn textfield value length 0 border color gray background color gray In html
  • 使用组件的 @ViewChild { read: ElementRef } 导致单元测试失败

    在我的组件中 我有一个如下所示的子组件
  • 关于您的项目所依赖的许可证的 Maven 报告[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个大型多模块项目 我想生成一份报告 显示该项目所依赖的所有内容的所有许可证 我查看了 tattl
  • 模拟正在测试的同一类中的私有方法

    我有一个名为的 Java 类 MyClass 我想用 JUnit 进行测试 公共方法 methodA 我想测试调用私有方法 methodB 在同一个类中确定要遵循哪个条件路径 我的目标是为不同路径编写 JUnit 测试methodA 还 m