为啥我在测试创建相同类的 phpUnit 静态方法后得到“无法加载模拟 MyClassConsumer,类已存在”?

Posted

技术标签:

【中文标题】为啥我在测试创建相同类的 phpUnit 静态方法后得到“无法加载模拟 MyClassConsumer,类已存在”?【英文标题】:Why I get `Could not load mock MyClassConsumer, class already exists` once I test my phpUnit static methods that create the very same class?为什么我在测试创建相同类的 phpUnit 静态方法后得到“无法加载模拟 MyClassConsumer,类已存在”? 【发布时间】:2020-07-03 18:24:00 【问题描述】:

我有以下课程:


public function MyClass

  public static foo():string
  
    // Some logic there
    // This is a dummy value just for explaining the problem
    return 'n123';
  

  public static factory():MyClass
  
    return new MyClass();
  


我也有以下课程:


class MyClassConsumer

 public function bar()
 
   $myclass=MyClass:factory();
   $myclass->foo();
 

在我的ClassConsumer 中,我也按照建议做了以下 phpunit 测试:

use PHPUnit\Framework\TestCase;
use Mockery;
use MyClassConsumer;

class TestMyClassConsumer extends TestCase

  public function testBar()
  
    $mockedFoo=Mockery:spy(MyClassConsumer::class);
    $mockedFoo->shouldReceive('foo')->andReturn('n1111');

    $mockedFactory=Mockery:mock('alias:'.MyClassConsumer::class);
    $mockedFactory->shouldReceive('factory')->andReturn($mockedFoo);

    $classConsumer=new ClassConsumer();
    $classConsumer->bar();
    $mockedFoo->shouldHaveReceived('foo');
  

但是一旦我测试它,我就会收到以下错误:

There was 1 error:

1) TestMyClassConsumer::testBar
Mockery\Exception\RuntimeException: Could not load mock MyClassConsumer, class already exists

/var/www/html/vendor/mockery/mockery/library/Mockery/Container.php:226
/var/www/html/vendor/mockery/mockery/library/Mockery.php:118
/var/www/html/tests/TestMyClassConsumer.php:30

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

您知道出现此错误的原因以及如何解决吗?

【问题讨论】:

【参考方案1】:
/**
 * @runInSeparateProcess
 * @preserveGlobalState disabled
 */

在您的测试上方添加这个 DocBlock。

【讨论】:

以上是关于为啥我在测试创建相同类的 phpUnit 静态方法后得到“无法加载模拟 MyClassConsumer,类已存在”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我运行我的 phpunit 测试时,我得到一个空响应,但 Postman 中的相同路由/用户的行为符合预期?

为啥 Laravel 中的 PHPUnit 不能访问存在的路由?

PHPUnit测试使用pdo的受保护静态方法

如何使用PHPUnit测试一个方法调用了同一个类的其他方法,但是没有返回值

PHPUnit存储测试类的属性

为啥通过 PhpUnit 运行测试时找不到我的自定义 TestCase 类?