Skip to content

Manually instantiated test doubles are broken since PHPUnit 11.2 #6362

@ostrolucky

Description

@ostrolucky
Q A
PHPUnit version 11.2.0 ... dev-main e0aea4c
PHP version 8.4.6
Installation Method Composer

Summary

Up to PHPUnit 11.1.* you can easily instantiate mock yourself. Calling methods on such objects was working fine. Since PHPUnit 11.2.0 (still broken in latest phpunit 12.x) this is no longer the case. You can still instantiate such class, but calling methods on it is broken.

Our use case was feed the FQCN of a mock class to Symfony DI container. DI container is then in charge of instantiating objects.

Ref doctrine/DoctrineBundle#2040

Issue6362Test.php

<?php declare(strict_types=1);
namespace PHPUnit\TestFixture\Issue6362;

use PHPUnit\Framework\TestCase;

interface I
{
    public function m(): string;
}

final class Issue6362Test extends TestCase
{
    public function testOne(): void
    {
        $class = $this->createStub(I::class)::class;

        $o = new $class;

        $o->m();
    }
}

Actual

PHPUnit Started (PHPUnit 12.4-g59f70b3a79 using PHP 8.4.12 (cli) on Linux)
Test Runner Configured
Event Facade Sealed
Test Suite Loaded (1 test)
Test Runner Started
Test Suite Sorted
Test Runner Execution Started (1 test)
Test Suite Started (PHPUnit\TestFixture\Issue6362\Issue6362Test, 1 test)
Test Preparation Started (PHPUnit\TestFixture\Issue6362\Issue6362Test::testOne)
Test Prepared (PHPUnit\TestFixture\Issue6362\Issue6362Test::testOne)
Test Stub Created (PHPUnit\TestFixture\Issue6362\I)
Test Errored (PHPUnit\TestFixture\Issue6362\Issue6362Test::testOne)
Typed property TestStub_I_7653f44f::$__phpunit_state must not be accessed before initialization
Test Finished (PHPUnit\TestFixture\Issue6362\Issue6362Test::testOne)
Test Suite Finished (PHPUnit\TestFixture\Issue6362\Issue6362Test, 1 test)
Test Runner Execution Finished
Test Runner Finished
PHPUnit Finished (Shell Exit Code: 2)

Expected

PHPUnit Started (PHPUnit 12.4-g59f70b3a79 using PHP 8.4.12 (cli) on Linux)
Test Runner Configured
Event Facade Sealed
Test Suite Loaded (1 test)
Test Runner Started
Test Suite Sorted
Test Runner Execution Started (1 test)
Test Suite Started (PHPUnit\TestFixture\Issue6362\Issue6362Test, 1 test)
Test Preparation Started (PHPUnit\TestFixture\Issue6362\Issue6362Test::testOne)
Test Prepared (PHPUnit\TestFixture\Issue6362\Issue6362Test::testOne)
Test Stub Created (PHPUnit\TestFixture\Issue6362\I)
Test Passed (PHPUnit\TestFixture\Issue6362\Issue6362Test::testOne)
Test Considered Risky (PHPUnit\TestFixture\Issue6362\Issue6362Test::testOne)
This test did not perform any assertions
Test Finished (PHPUnit\TestFixture\Issue6362\Issue6362Test::testOne)
Test Suite Finished (PHPUnit\TestFixture\Issue6362\Issue6362Test, 1 test)
Test Runner Execution Finished
Test Runner Finished
PHPUnit Finished (Shell Exit Code: 0)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions