PHPUnit assert 不调用任何方法

2022-08-30 12:14:39

我有一个使用 ServiceB 的 ClassA。在某些情况下,A 类最终应该不会调用 ServiceB 的任何方法。我现在想测试一下,并且确实没有调用任何方法。

这可以按如下方式完成:

$classA->expects( $this->never() )->method( 'first_method' );
$classA->expects( $this->never() )->method( 'second_method' );
...

有没有办法简单地声明“不应在此对象上调用任何方法”,而不必为每个方法指定限制?


答案 1

是的,这很简单,试试这个:

$classA->expects($this->never())->method($this->anything());

答案 2

您可以使用方法 。MockBuilder::disableAutoReturnValueGeneration

例如,在测试中,覆盖默认值:TestCase::getMockBuilder

    /**
     * @param string $className
     * @return MockBuilder
     */
    public function getMockBuilder($className): MockBuilder
    {
        // this is to make sure, that not-mocked method will not be called
        return parent::getMockBuilder($className)
            ->disableAutoReturnValueGeneration();
    }

优势:

  • 你所有的模拟都不会被期望调用任何东西,除了模拟的方法。无需绑定到所有这些->expects(self::never())->method(self::anything())
  • 你仍然可以设置新的模拟。在你不能之后->expects(self::never())->method(self::anything())

适用于PhpUnit v7.5.4(可能还有后来的版本)。


推荐