PHPUnit: заглушка нескольких интерфейсов

Я начинаю разбираться с PHPUnit, и до сих пор нашел его довольно простым в использовании, но я столкнулся с тестовым примером, который заставляет меня трудность.

Я пишу код для набора интерфейсов, которые, как ожидается, будут реализованы объектами (некоторые PHP, некоторые самодельные), а SUT требует входного объекта для реализации нескольких интерфейсов. Например:

class MyClass implements ArrayAccess, MyInterface
{
    // ...
}

SUT делает следующее:

class ClassToBeTested
{
    protected $obj = NULL;

    public function __construct ($obj)
    {
        $this -> obj = $obj;
    }

    public function methodToBeTested ()
    {
        if ($this -> obj instanceof ArrayAccess)
        && ($this -> obj instanceof MyInterface)
        {
            // ...
        }
    }

    public function otherMethodUnderTest ()
    {
        if ($this -> obj instanceof ArrayAccess)
        {
            // ...
        }
        else
        if ($this -> obj instanceof MyInterface)
        {
            // ...
        }
    }
}

Я могу создать заглушку из одного интерфейса или другого, но я не знаю, сможете ли вы создать заглушку, которая реализует их оба.

protected function setUp ()
{
    $stubField  = $this -> getMockBuilder ('ArrayAccess')
            -> getMock ();
    $this -> object = new ClassToBeTested ($stubField);
}

или

protected function setUp ()
{
    $stubField  = $this -> getMockBuilder ('MyInterface')
            -> getMock ();
    $this -> object = new ClassToBeTested ($stubField);
}

Можно ли сгенерировать заглушки из списка интерфейсов, или мне нужно заглушить конкретный класс, реализующий ожидаемые интерфейсы? Это само по себе вызывает трудности, потому что класс, который нужно заглушить, сам нуждается в другом объекте, который нужно передать его конструктору, и я не могу заставить работать disableOriginalConstructor () или setConstructorArgs (), я думаю, это потому, что конкретные классы, о которых идет речь, сами не реализуют конструктор, а наследуют его от суперкласса. Я упустил здесь что-то очевидное?

7
задан GordonM 17 December 2011 в 10:44
поделиться