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

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

Barbara Streisand
Barbara Streisand原创
2024-10-30 04:55:28915浏览

 When Should You Mock Private Methods in PHPUnit?

使用 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 实现此目的:

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

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

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

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

结论

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

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

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