如果我有一个与B类交互的A类,那么在我的测试中,我想模拟B类,以便我可以单独测试A类。
使用"getMock('classname')"
在PHPUnit中很容易做到这一点。
我目前的问题是:如果class A
使用class B
的多个实例,我无法使用"getMock('B')"
模拟此情况,因为"getMock"
似乎不会返回多个实例多次调用,但始终是class B
的模拟。
以下示例:
<?php
class A()
{
private class_b_1;
private class_b_2;
public function setClassB1(B $class_b)
{
$this->class_b_1 = $class_b;
}
public function setClassB2(B $class_b)
{
$this->class_b_2 = $class_b;
}
}
在我的测试中:
$mock_one_of_class_b = $this -> getMock('B');
$mock_two_of_class_b = $this -> getMock('B');
然后$mock_one_of_class_b
与$mock_two_of_class_b
是同一个对象。
如何使用PHPUnit
模拟多个类的实例?
提前致谢!
答案 0 :(得分:3)
实际上getMock
方法会创建不同的模拟类实例。看看这个例子:
class Foo
{
protected $value;
public function setValue($value)
{
$this->value = $value;
}
public function getValue()
{
return $this->value;
}
}
现在我们为它创建测试:
class FooTest extends \PHPUnit_Framework_TestCase
{
public function testFoo()
{
$a = $this->getMock('Foo', array('someNonExistingMethod'));
$b = $this->getMock('Foo', array('someNonExistingMethod'));
$a->setValue(1);
$b->setValue(234);
$this->assertEquals(1, $a->getValue(), 'This test will fail if "a" and "b" objects are the same');
}
}
注意getMock
方法中的第二个参数。在该论证中,您告诉phpunit
将模拟哪些方法。如果你根本没有传递任何参数 - 那么phpunit
假设你想要模拟来自对象的所有方法。所以,如果你传递array('someNonExistingMethod')
那么就不会有任何模拟方法(并且会在调用时调用“真正的”方法)。