为啥我在测试创建相同类的 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 不能访问存在的路由?