Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHPUnit-类的mock方法使用创建的实例_Php_Unit Testing_Mocking_Phpunit_Instantiation - Fatal编程技术网

PHPUnit-类的mock方法使用创建的实例

PHPUnit-类的mock方法使用创建的实例,php,unit-testing,mocking,phpunit,instantiation,Php,Unit Testing,Mocking,Phpunit,Instantiation,我想在类中模拟方法foo,但保持方法bar不变: <?php class MyClass { protected $dep1; protected $dep2; protected $dep3; protected $dep4; /** * Test constructor. * @param $dep1 * @param $dep2 * @param $dep3 * @param $dep4

我想在类中模拟方法
foo
,但保持方法
bar
不变:

<?php

class MyClass
{
    protected $dep1;
    protected $dep2;
    protected $dep3;
    protected $dep4;

    /**
     * Test constructor.
     * @param $dep1
     * @param $dep2
     * @param $dep3
     * @param $dep4
     */
    public function __construct($dep1, $dep2, $dep3, $dep4)
    {
        $this->dep1 = $dep1;
        $this->dep2 = $dep2;
        $this->dep3 = $dep3;
        $this->dep4 = $dep4;

        parent::__construct();
    }

    public function foo()
    {
        return "foo";
    }

    public function bar()
    {
        return "bar";
    }
}
是否可以以某种方式为已创建的
MyClass
实例创建代理,该实例只覆盖
foo
方法?有没有其他方法(没有runkit pecl扩展)来模拟现有/实例化对象的方法


我知道PHPUnit有一些与代理相关的方法,但是我找不到任何文档/示例来说明它们的用法,所以我不确定它们是否可以用来解决我的问题。

你不能模拟依赖关系吗?而不是用一种复杂的方法获取它们?是的,但这是一种集成测试。所以我需要依赖项来完成它们的工作……我已经看到通过重用(而不是复制/粘贴)工厂类来解决这个问题。扩展
OriginalFactory
TestFactory
可以用于设置测试,但也可以最小化对原始代码的再次重写。
class TestMyClass extends \PHPUnit\Framework\TestCase {
    public function setUp()
    {
        // complicated way to retrieve $dep1 to $dep4

        $mock = $this->getMockBuilder(MyClass::class)->setMethods(['foo'])->setConstructorArgs([$dep1, $dep2, $dep3, $dep4])->getMock();
        $mock->expects($this->any())->method('foo')->willReturn(false);
    }
}