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);
}
}