Я хочу смоделировать метод 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
создается через фабрику, которая извлекает зависимости ($dep1
, $dep2
, ...) и вставляет их непосредственно в конструктор MyClass
.
Поэтому я хочу использовать эту Фабрику и создать экземпляр объекта MyClass (в противном случае сложный экземпляр должен быть закодирован и в тестовом примере).
Короче говоря, я хочу знать, есть ли другое решение, чем:
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);
}
}
Можно ли каким-то образом создать прокси для уже созданного экземпляра MyClass
, который просто переопределяет метод foo
? Есть ли другой способ (без расширения pek runkit) для насмешки метода существующего / созданного объекта?
Я знаю, что в PHPUnit есть некоторые Proxy
связанные методы, но я не смог найти какую-либо документацию / пример их использования, поэтому я не уверен, могут ли они вообще использоваться для решения моей проблемы.