Spott schlägt fehl mit „Mock konnte nicht geladen werden … Klasse existiert bereits“, wenn es mit –code-coverage ausgeführt wird

Lesezeit: 2 Minuten

Benutzeravatar von Daniel Becker
Daniel Becker

Ich versuche, eine Klasse für phpunit zu verspotten. PHP-Einheit schlägt mit dem Fehler fehl Could not load mock ... class already exists. Dies ist der einzige Test, den ich durchführe, also kann es nicht sein, dass die Klasse bereits verspottet ist.

Jeder Vorschlag wäre willkommen.

Hier der Fehlerfall:

namespace Tests\Feature;

use Tests\TestCase;

class DeactivateACSTest extends TestCase
{
    public function testDeactivateAcs()
    {
        $deviceController = \Mockery::mock('overload:App\Http\Controllers\Cloud\DeviceController');
        $deviceController
            ->shouldReceive('deactivateACS')
            ->andReturn('hilfehilfehilfe');

        $devCon = new \App\Http\Controllers\Cloud\DeviceController();
        $this->assertEquals('hilfehilfehilfe', $devCon->deactivateACS());
    }
}

Wenn es ohne läuft --code-coverage Es klappt:

[13:10:15] vagrant@homestead [~/Code/ekp] $ phpunit --filter DeactivateACS
PHPUnit 6.5.10 by Sebastian Bergmann and contributors.


 ==> Tests\Feature\DeactivateACSTest              ✓

Time: 1.08 seconds, Memory: 16.00MB

OK (1 test, 3 assertions)

Allerdings läuft es mit --code-coverage es schlägt fehl:

[13:10:23] vagrant@homestead [~/Code/ekp] $ phpunit --coverage-html coverage --coverage-text=code_coverage.txt --filter DeactivateACSTest
PHPUnit 6.5.10 by Sebastian Bergmann and contributors.


  ==> Tests\Feature\DeactivateACSTest              ⚈

Time: 5.79 seconds, Memory: 44.00MB

There was 1 error:

1) Tests\Feature\DeactivateACSTest::testDeactivateAcs
Mockery\Exception\RuntimeException: Could not load mock \App\Http\Controllers\Cloud\DeviceController, class already exists

/home/vagrant/Code/ekp/vendor/mockery/mockery/library/Mockery/Container.php:220
/home/vagrant/Code/ekp/vendor/mockery/mockery/library/Mockery.php:116
/home/vagrant/Code/ekp/tests/Feature/DeactivateACSTest.php:11

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.

Generating code coverage report in HTML format ... done

  • das gleiche problem wie hast du es gelöst?

    – Ultimatum

    21. November 2018 um 15:27 Uhr

Sie sollten diese Anmerkungen vor den Funktionen hinzufügen, die diese Klasse verspotten.

/**
 * @runInSeparateProcess
 * @preserveGlobalState disabled
 */

Als Referenz können Sie die phpunit-Dokumentation lesen.

https://phpunit.de/manual/current/en/appendixes.annotations.html#appendixes.annotations.runInSeparateProcess

https://phpunit.de/manual/current/en/appendixes.annotations.html#appendixes.annotations.preserveGlobalState

  • Funktioniert nicht in phpunit 7.4.3 und Mockery 1.2.2. Es gibt immer noch die Mockery\Exception\RuntimeException: Could not load mock Service, class already exists Fehler.

    – Juha Untinen

    10. April 2019 um 10:15 Uhr

  • Toller Trick! Dies funktionierte perfekt mit PHPUnit 9.5 und Mockery 1.4 für eine Testklasse, in der ich mehrere Instanz-Mocks mit verwendet habe overload Präfix. Letztendlich habe ich mit der @runTestsInSeparateProcesses der Einfachheit halber Anmerkungen zur gesamten Klasse. (In meinem Fall @preserveGlobalState wurde eigentlich nicht benötigt … YMMV).

    – Andron

    3. März 2021 um 22:11 Uhr

  • Update… stellt sich heraus, dass diese bestimmte Testklasse auch ohne laufen könnte @preserveGlobalState disabledaber ich musste es dem Klassenkommentar hinzufügen, damit die gesamte Testsuite ordnungsgemäß ausgeführt wird.

    – Andron

    4. März 2021 um 13:53 Uhr


Benutzeravatar von Vivek G
Vivek G

Ich bin auf das gleiche Problem gestoßen und habe es wie folgt behoben:

  1. Es gab einen anderen Test in meinen Unit-Tests (kein Spotttest), der hatte require_once auf der PHP-Datei, die die Klasse hatte, die ich verspottete. Ich habe diese Zeile entfernt.
  2. Ich habe hinzugefügt processIsolation="true" in der Testsuite

1444660cookie-checkSpott schlägt fehl mit „Mock konnte nicht geladen werden … Klasse existiert bereits“, wenn es mit –code-coverage ausgeführt wird

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy