You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHPUnit中Mock对象应设置为原类还是MockObject类型?

PHPUnit Mock对象类型声明方案
  • 优先使用实际业务类作为类型声明
    你当前的示例代码仅调用原业务类SomeClass的内置方法,这种场景直接声明为SomeClass是最优选择:
    • PHPUnit生成的Mock对象默认继承原业务类,符合PHP类型约束,运行不会报错
    • IDE可正常识别并补全原业务类的所有方法,不会出现补全失效的问题
  • 当需要调用MockObject专属方法时的处理
    如果你需要在测试方法内调用expects()、method()等MockObject接口自带的方法配置Mock行为,可根据PHP版本选择方案:
    • PHP 8.0及以上版本:使用交集类型声明SomeClass&MockObject $someClassMock,可同时支持原业务类和MockObject方法的IDE补全,完全兼容运行逻辑,示例如下:
      /**
       * @dataProvider getTestDataProvider
       * @throws Exception
       */
      public function testExampleData(
          Request $request,
          Response $expected,
          SomeClass&MockObject $someClassMock
      ): void {
          // 同时支持两类方法的补全
          $someClassMock->expects($this->once())->method('getData')->willReturn($expected);
          $result = $someClassMock->getData($request);
      
          $this->assertEquals($expected, $result);
      }
      
    • PHP 8.0以下版本:仍保留SomeClass作为主类型声明,需要调用MockObject方法前添加单行临时类型标注即可:/** @var MockObject $someClassMock */
  • 不推荐单独使用MockObject作为类型声明
    单独声明为MockObject时,IDE无法识别原业务类的内置方法,会直接导致业务方法补全失效,仅在测试逻辑完全不需要调用原类方法的极端场景下可以使用。

内容的提问来源于stack exchange,提问作者The50

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:51:03