代码:
MyMockClass.php
<?php
class MyMockClass
{
public function __construct($l)
{
// Do nothing with it
}
protected function loadData($var)
{
// Do something, it doesn't matter what
return null;
}
public function onEvent($key)
{
return $this->loadData($key);
}
}
MockTest.php
<?php
class MockTest extends \PHPUnit_Framework_TestCase
{
public function testPHPUnitMock()
{
$mock = $this->getMockBuilder('MyMockClass')->setConstructorArgs(array(true))->getMock();
$mock->expects($this->once())->method('loadData')->with('TEST')->will($this >returnValue(true));
$this->assertEquals(true, $mock->onEvent('TEST'));
}
}
当我运行此测试时,它失败,输出如下:
PHPUnit_Framework_ExpectationFailedException : Failed asserting that null matches expected true.
Expected :true
Actual :null
我正在尝试执行onEvent
,而onEvent
依次执行我嘲笑过的函数,并改变了结果。但mail()
函数似乎没有被调用。如果我在onEvent
中添加{{1}}(或类似内容),我就不会收到任何邮件。
答案 0 :(得分:5)
如果你没有告诉模拟构建器你要模拟哪些方法 - 默认情况下,模拟类中的所有方法都将被模拟。
在您的测试中调用onEvent方法的情况下,实际上您已经调用了一个模拟方法。
如果指定要模拟的方法,则模拟构建器将仅模拟这些方法,并将其余方法保留为原始类。
所以,尝试以这种方式构建你的模拟:
public function testPHPUnitMock()
{
$mock = $this->getMockBuilder('MyMockClass')
->setMethods(array('loadData')) // this line tells mock builder which methods should be mocked
->setConstructorArgs(array(true))
->getMock();
$mock->expects($this->once())->method('loadData')->with('TEST')->will($this >returnValue(true));
$this->assertTrue($mock->onEvent('TEST'));
}