如何用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
相关产品推荐
相关产品推荐

