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

如何用PHPUnit模拟类验证doSomething触发的内部方法调用

验证方法调用情况的单元测试实现方案

完全可行,用PHPUnit的**部分模拟(partial mock)**就能实现这个需求——既保留doSomething()的真实逻辑,又能监控methodA()和methodB()的调用情况。

具体测试代码示例

use PHPUnit\Framework\TestCase;

class HelloTest extends TestCase
{
    public function testDoSomethingCallsMethodAWhenInputIs1()
    {
        // 创建Hello类的部分模拟,仅替换methodA和methodB的实现
        $helloMock = $this->getMockBuilder(Hello::class)
            ->setMethods(['methodA', 'methodB'])
            ->getMock();

        // 断言methodA会被调用1次,methodB不会被调用
        $helloMock->expects($this->once())
            ->method('methodA');
        $helloMock->expects($this->never())
            ->method('methodB');

        // 触发测试逻辑
        $helloMock->doSomething(1);
    }

    public function testDoSomethingCallsMethodBWhenInputIsNot1()
    {
        $helloMock = $this->getMockBuilder(Hello::class)
            ->setMethods(['methodA', 'methodB'])
            ->getMock();

        $helloMock->expects($this->never())
            ->method('methodA');
        $helloMock->expects($this->once())
            ->method('methodB');

        $helloMock->doSomething(2);
    }
}

关键逻辑说明

  • getMockBuilder(Hello::class)->setMethods(['methodA', 'methodB']):生成Hello类的部分模拟对象,仅替换methodA和methodB的实现,doSomething保持原逻辑不变。
  • expects($this->once())->method('methodA'):断言methodA会被调用恰好1次;never()则断言方法完全不会被调用。
  • 调用doSomething()后,PHPUnit会自动验证这些断言是否成立,无需关心methodA和methodB的实际返回值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:16:15