getMock - 同一个类的多个实例

时间:2013-01-12 14:12:31

标签: php phpunit

如果我有一个与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模拟多个类的实例?

提前致谢!

1 个答案:

答案 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')那么就不会有任何模拟方法(并且会在调用时调用“真正的”方法)。