PHPUnit模拟抽象类的所有方法

Jer*_*auw 6 php testing phpunit unit-testing mocking

我有一个直接派生自PHPUnit_Framework_TestCase的PHPUnit测试用例.在这个类的测试中,我需要获得一些服务对象的模拟.此服务对象是由抽象基类定义的类型.该基类包含具体和抽象方法.我想得到一个完整的模拟事物(即所有方法被嘲笑).我的问题是如何做到这一点.

- > getMock给我一个错误,因为抽象方法没有被模拟,只有具体的

- > getMockForAbstractClass模拟抽象方法,但不是具体方法

我该如何嘲笑他们?

(我正在使用PHPUnit 3.7.13)

edo*_*ian 6

只是调用->getMock('Class');将模拟对象上的所有方法并实现所有抽象方法.

我不确定你哪里出错,但既然如此,看似直截了当我写了一个样本.

如果它不适合你,我需要一个你想要做的重现案例

样品

<?php

class mockTest extends PHPUnit_Framework_TestCase {

    // Without expectations
    public function testMocking() {
        $x = $this->getMock('MockMe');
        $this->assertNull($x->foo());
        $this->assertNull($x->bar());
    }

    // With expectations
    public function testMocking2() {
        $x = $this->getMock('MockMe');
        $x->expects($this->once())->method('foo')->will($this->returnValue(true));
        $x->expects($this->once())->method('bar')->will($this->returnValue(true));
        $this->assertTrue($x->foo());
        $this->assertTrue($x->bar());
    }

}

abstract class MockMe {

    abstract public function foo();

    public function bar() {
        return 1 + $this->foo();
    }

}
Run Code Online (Sandbox Code Playgroud)

产生

PHPUnit 3.7.13 by Sebastian Bergmann.

..

Time: 0 seconds, Memory: 6.25Mb

OK (2 tests, 5 assertions)
Run Code Online (Sandbox Code Playgroud)

  • 我正在做$ this-> getMock('SomeAbstractClass').得到这个:致命错误:类Mock_SomeAbstractClass_cbc14c8a包含2个抽象方法,因此必须声明为abstract或在/ usr/share/php/PHPUnit/Framework/MockObject/Generator中实现其余方法(SomeAbstractClass :: foo,SomeAbstractClass :: bar). php(231):eval()'代码在3302行 (3认同)