问题是我嘲笑的依赖有一个expects()方法.这个类依赖于我正在测试的类.
setUp()方法
$this->test = $this->getMockBuilder(Request::class)->disableOriginalConstructor()
->getMock();
Run Code Online (Sandbox Code Playgroud)
所以当我写我的测试
$this->test->expects($this->once())->method('otherMethod')
->willReturn(0);
Run Code Online (Sandbox Code Playgroud)
这会产生错误:
无法重新声明Mock_Test_f21c25ee :: expected()in ...
我怎么解决这个问题?
编辑:
我尝试了建议的解决方案与setMethodsExcept()我现在有一个不同的错误消息.我也在使用PHPunit 7.5
Mock_Test_fa1cb6c5 :: expected(PHPUnit\Framework\MockObject\Matcher\Invocation $ matcher)的声明应该与App\Services\Api\Test :: expected()兼容
注意:忘了提到我正在使用具有自己的TestBase类的Laravel 5.5
Edit2:在我尝试使用默认的PHPUnit测试用例之后,我仍然得到与上面相同的错误消息.(必须与错误兼容)
您需要使用该setMethodsExcept()方法来避免该excepts方法的重新声明。
以这种方式创建模拟应该可以:
$this->request = $this->getMockBuilder(Request::class)
->setMethodsExcept(['expects'])
->disableOriginalConstructor()
->getMock();
Run Code Online (Sandbox Code Playgroud)
编辑:一些澄清:
为了测试您的案例,我执行了以下操作:
class Expecting
{
public function get()
{
return 'my json';
}
public function expects()
{
return 'who knows what';
}
}
class ClassA
{
public function testMe($the_expect_dependency)
{
$the_expect_dependency->get();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的单元测试中,我的声明与您几乎相同:
class ClassATest extends \PHPUnit\Framework\TestCase
{
public function testThatItCanBeMocked()
{
$mock = $this->getMockBuilder(Expecting::class)
->setMethodsExcept(['expects'])
->disableOriginalConstructor()
->getMock();
$mock->expects($this->once())->method('get')
->willReturn('my json');
$my_obj = new ClassA();
$my_obj->testMe($mock);
}
}
Run Code Online (Sandbox Code Playgroud)
删除setMethodsExcept()呼叫时,它给出的错误正是您提到的,不确定可能出了什么问题?
顺便说一句,我正在使用 phpunit 版本 7.5。