简介
模拟私有方法可能是测试逻辑的有用技术。类而不暴露其实现细节。但是,请务必谨慎处理此问题,以避免破坏封装并损害代码的完整性。
问题
考虑以下示例:
<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中文网其他相关文章!