什么时候应该在 PHPUnit 中模拟私有方法?
Oct 30, 2024 am 04:55 AM使用 PHPUnit 模拟私有方法
简介
模拟私有方法可能是测试逻辑的有用技术。类而不暴露其实现细节。但是,请务必谨慎处理此问题,以避免破坏封装并损害代码的完整性。
问题
考虑以下示例:
<code class="php">class A { public function b() { // some code $this->c(); // some more code } private function c(){ // some code } }</code>
登录后复制
如何使用 PHPUnit 对私有方法 c() 的结果进行存根测试公共函数 b() 的“更多代码”部分?
解决方案
选项 1:考虑重构
通常,直接测试私有方法不被认为是最佳实践。相反,应专注于测试类的公共 API。任何内部实现细节都应被视为黑匣子。
选项 2:利用 Mock(谨慎操作)
但是,在某些情况下,模拟私有方法可能会必要的。要使用 PHPUnit 实现此目的:
-
为被测试的类创建一个模拟对象:
<code class="php">$mock = $this->getMockBuilder('A') ->disableOriginalConstructor() ->getMock();</code>
登录后复制 -
定义私有的预期行为方法:
<code class="php">$mock->expects($this->once()) ->method('c') ->will($this->returnValue(YOUR_STUBBED_VALUE));</code>
登录后复制 -
将原始实例替换为测试中的模拟:
<code class="php">$originalInstance = new A(); $this->reflection()->setProtectedProperty( $originalInstance, 'c', $mock );</code>
登录后复制 - 照常运行您的测试。
结论
虽然为了测试目的而模拟私有方法可能很诱人,但优先考虑封装原则并避免不必要地暴露内部细节非常重要。考虑重构您的代码以在不依赖私有方法模拟的情况下启用测试。
以上是什么时候应该在 PHPUnit 中模拟私有方法?的详细内容。更多信息请关注PHP中文网其他相关文章!
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章
击败分裂小说需要多长时间?
3 周前
By DDD
仓库:如何复兴队友
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前
By 尊渡假赌尊渡假赌尊渡假赌
公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验?
3 周前
By 王林

热门文章
击败分裂小说需要多长时间?
3 周前
By DDD
仓库:如何复兴队友
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前
By 尊渡假赌尊渡假赌尊渡假赌
公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验?
3 周前
By 王林

热门文章标签

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)