Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?


Failed to load latest commit information.
Latest commit message
Commit time


Mock PHP built-in functions with PHPUnit

This package integrates the function mock library PHP-Mock with PHPUnit.


Use Composer:

composer require --dev php-mock/php-mock-phpunit


PHP-Mock integrates with the trait PHPMock into your PHPUnit test case. This trait extends the framework by the method getFunctionMock(). With this method you can build a mock in the way you are used to build a PHPUnit mock:

namespace foo;

class BuiltinTest extends \PHPUnit\Framework\TestCase

    use \phpmock\phpunit\PHPMock;

    public function testTime()
        $time = $this->getFunctionMock(__NAMESPACE__, "time");

        $this->assertEquals(3, time());

    public function testExec()
        $exec = $this->getFunctionMock(__NAMESPACE__, "exec");
            function ($command, &$output, &$return_var) {
                $this->assertEquals("foo", $command);
                $output = ["failure"];
                $return_var = 1;

        exec("foo", $output, $return_var);
        $this->assertEquals(["failure"], $output);
        $this->assertEquals(1, $return_var);

There's no need to disable the mocked function. The PHPUnit integration does that for you.


This library comes with the same restrictions as the underlying php-mock:

  • Only unqualified function calls in a namespace context can be mocked. E.g. a call for time() in the namespace foo is mockable, a call for \time() is not.

  • The mock has to be defined before the first call to the unqualified function in the tested class. This is documented in Bug #68541. In most cases you can ignore this restriction. But if you happen to run into this issue you can call PHPMock::defineFunctionMock() before that first call (e.g. with @beforeClass). This would define a side effectless namespaced function. Another effective approach is running your test in an isolated process (e.g. with @runInSeparateProcess).

License and authors

This project is free and under the WTFPL. Responsable for this project is Markus Malkusch


If you like this project and feel generous donate a few Bitcoins here: 1335STSwu9hST4vcMRppEPgENMHD2r1REK