1

如果我有一个与 B 类交互的 A 类,那么在我的测试中我想模拟 B 类,以便我可以单独测试 A 类。

这很容易在 PHPUnit 中使用"getMock('classname')".

我目前的问题是:如果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

提前致谢!

4

1 回答 1

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

于 2013-01-13T11:30:07.137 回答