PHPUnit模拟抽象类的所有方法

标签 php unit-testing testing mocking phpunit

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

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

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

我如何将它们全部模拟出来?

(我正在使用 PHPUnit 3.7.13)

最佳答案

只需调用 ->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();
    }

}

产生

PHPUnit 3.7.13 by Sebastian Bergmann.

..

Time: 0 seconds, Memory: 6.25Mb

OK (2 tests, 5 assertions)

关于PHPUnit模拟抽象类的所有方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16171927/

相关文章:

安全测试工具

php - 平 : sending the full log by email?

php - 在php中的一个查询中定义变量并运行查询

entity-framework - 在每个单元测试之前重新创建和重新设置 LocalDb

unit-testing - 如果单元测试执行了数据库插入/更新/删除,如何检查 Play Framework

php - PHP 中使用 self::的单元测试类

laravel - 在 Laravel Dusk 上将用户代理更改为移动

php - 在另一个词之前或之后获取一个词

php - MySQL/PHP 按天分组

java - 使用 Ivy 的类路径问题