目录
使用 PHPUnit 模拟私有方法
首页 后端开发 php教程 什么时候应该在 PHPUnit 中模拟私有方法?

什么时候应该在 PHPUnit 中模拟私有方法?

Oct 30, 2024 am 04:55 AM

 When Should You Mock Private Methods in PHPUnit?

使用 PHPUnit 模拟私有方法

简介

模拟私有方法可能是测试逻辑的有用技术。类而不暴露其实现细节。但是,请务必谨慎处理此问题,以避免破坏封装并损害代码的完整性。

问题

考虑以下示例:

<code class="php">class A {
  public function b() { 
    // some code
    $this-&gt;c(); 
    // some more code
  }

  private function c(){ 
    // some code
  }
}</code>
登录后复制

如何使用 PHPUnit 对私有方法 c() 的结果进行存根测试公共函数 b() 的“更多代码”部分?

解决方案

选项 1:考虑重构

通常,直接测试私有方法不被认为是最佳实践。相反,应专注于测试类的公共 API。任何内部实现细节都应被视为黑匣子。

选项 2:利用 Mock(谨慎操作)

但是,在某些情况下,模拟私有方法可能会必要的。要使用 PHPUnit 实现此目的:

  1. 为被测试的类创建一个模拟对象:

    <code class="php">$mock = $this-&gt;getMockBuilder('A')
                -&gt;disableOriginalConstructor()
                -&gt;getMock();</code>
    登录后复制
  2. 定义私有的预期行为方法:

    <code class="php">$mock-&gt;expects($this-&gt;once())
        -&gt;method('c')
        -&gt;will($this-&gt;returnValue(YOUR_STUBBED_VALUE));</code>
    登录后复制
  3. 将原始实例替换为测试中的模拟:

    <code class="php">$originalInstance = new A();
    $this-&gt;reflection()-&gt;setProtectedProperty(
       $originalInstance,
       'c',
       $mock
    );</code>
    登录后复制
  4. 照常运行您的测试。

结论

虽然为了测试目的而模拟私有方法可能很诱人,但优先考虑封装原则并避免不必要地暴露内部细节非常重要。考虑重构您的代码以在不依赖私有方法模拟的情况下启用测试。

以上是什么时候应该在 PHPUnit 中模拟私有方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章

仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章

仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章标签

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

11个最佳PHP URL缩短脚本(免费和高级) 11个最佳PHP URL缩短脚本(免费和高级) Mar 03, 2025 am 10:49 AM

11个最佳PHP URL缩短脚本(免费和高级)

在Laravel中使用Flash会话数据 在Laravel中使用Flash会话数据 Mar 12, 2025 pm 05:08 PM

在Laravel中使用Flash会话数据

Instagram API简介 Instagram API简介 Mar 02, 2025 am 09:32 AM

Instagram API简介

简化的HTTP响应在Laravel测试中模拟了 简化的HTTP响应在Laravel测试中模拟了 Mar 12, 2025 pm 05:09 PM

简化的HTTP响应在Laravel测试中模拟了

构建具有Laravel后端的React应用程序:第2部分,React 构建具有Laravel后端的React应用程序:第2部分,React Mar 04, 2025 am 09:33 AM

构建具有Laravel后端的React应用程序:第2部分,React

php中的卷曲:如何在REST API中使用PHP卷曲扩展 php中的卷曲:如何在REST API中使用PHP卷曲扩展 Mar 14, 2025 am 11:42 AM

php中的卷曲:如何在REST API中使用PHP卷曲扩展

在Codecanyon上的12个最佳PHP聊天脚本 在Codecanyon上的12个最佳PHP聊天脚本 Mar 13, 2025 pm 12:08 PM

在Codecanyon上的12个最佳PHP聊天脚本

Laravel中的通知 Laravel中的通知 Mar 04, 2025 am 09:22 AM

Laravel中的通知

See all articles