在另一个类中模拟单个函数调用

时间:2011-02-21 19:45:29

标签: mocking phpunit

classA::getValue()调用另一个类classB::verifyValue()中的方法。由于classB::verifyValue()具有外部依赖关系,因此我希望能够将其模拟为仅在单元测试中返回true

我不想触及classB中的任何其他内容,仅此一种方法。

2 个答案:

答案 0 :(得分:2)

您可以像Spidy建议的那样创建测试存根,也可以使用PHPUnit的内置mock objects。两者都要求您能够为classB提供classA实例才能使用。

function testGetValue() {
    // set up mock classB
    $b = $this->getMock('classB', array('verifyValue'));
    $b->expects($this->once())
      ->method('verifyValue')
      ->will($this->returnValue(true));

    // set up classA
    $a = ...
    $a->setClassB($b);

    // test getValue()
    ... $a->getValue() ...
}

答案 1 :(得分:0)

在测试中使用接口和MockClassB。例如,interfaceB具有verifyValue()。所以classB实现了interfaceB并覆盖了verifyValue。然后创建另一个名为MockClassB的类,并让它实现interfaceB。在你的测试代码中,而不是创建classB,创建MockClassB(MockClassB将返回true而不是依赖于外部依赖)。

如果这没有足够的意义,请查看“编程到接口,而不是实现”