47

I have a ClassA that uses a ServiceB. In a certain case, ClassA should end up not invoking any methods of ServiceB. I now want to test this and verity no methods are indeed called.

This can be done as follows:

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

Is there a way to simply state "no method should be called on this object" rather then having to specify a restriction for each method?

Jeroen De Dauw
  • 10,321
  • 15
  • 56
  • 79

3 Answers3

87

Yes, it's quite simple, try this:

$classA->expects($this->never())->method($this->anything());
Cyprian
  • 11,174
  • 1
  • 48
  • 45
  • Nowadays you should likely use `$classA->expects(self::never())->method(self::anything())`; – ptkoz Jan 22 '23 at 15:44
2

You can use method MockBuilder::disableAutoReturnValueGeneration.

For example, in your test overwrite default 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();
    }

Advantages:

  • all your mocks won't be expected to call anything than mocked methods. No need to bind ->expects(self::never())->method(self::anything()) to all of them
  • you still can set new mocks. After ->expects(self::never())->method(self::anything()) you can't

Works for PhpUnit v7.5.4 (and probably, later ones).

Oleksandr Boiko
  • 182
  • 3
  • 9
0

you could also mock a method and a data provider, and make sure it never is called. without making any assertions, because it is not called, it means it has passed the test.

<?php
    /**
     * @dataProvider dataProvider
     */
    public function checkSomethingIsDisabled( $message, $config, $expected)
    {
        $debugMock = $this->getMockBuilder('APP_Class_Name')
            ->disableOriginalConstructor()
            ->setMethods(array('_helper'))
            ->getMock();

        $debugMock = $this->getPublicClass($debugMock);
        $debugMock->_config = $config;
        $viewContent = new stdClass;
        $debugMock->_functionToTest($viewContent);
    }

    public function dataProvider()
    {
        return [
                'dataset'=>
                    [
                        'message' => 'Debug Disabled',
                        'config' => (object) array(
                            'values' => (object) array(
                                'valueThatWhenFalseDoesntExecuteFunc'=> false
                            )
                        ),
                        // in a probably needed complimentary "imaginary" test we probably  
                        // will have the valueThatWhenFalseDoesntExecuteFunc set to true and on
                        // expected more information to handle and test.
                        'expected' => null
                    ]
                ];
    }
Yala Yala Herzlin
  • 552
  • 2
  • 8
  • 25