如何使用phpunit自动模拟类中的类?

如何使用phpunit自动模拟类中的类?,php,unit-testing,mocking,phpunit,Php,Unit Testing,Mocking,Phpunit,我的班级结构如下: class A { public someFunction() { $objectB = new B(); $result = $objectB->getResult(); return $result; } } 我正在为属于类A的someFunction()编写单元测试。但是,它取决于类B。我可以模拟someFunction(),但如何解决对类B的依赖?我想自动模拟类B。使用依赖项注入:提供一个方法来设

我的班级结构如下:

class A {
    public someFunction() {
        $objectB = new B();
        $result = $objectB->getResult();
        return $result;
    }
}

我正在为属于类
A
someFunction()
编写单元测试。但是,它取决于类
B
。我可以模拟
someFunction()
,但如何解决对类B的依赖?我想自动模拟类
B

使用依赖项注入:提供一个方法来设置B对象,或者可以选择将B对象传递给
someFunction()

原始代码 可选参数 塞特法
使用依赖项注入:提供一种方法来设置B对象,或者可选地将B对象传递给
someFunction()

原始代码 可选参数 塞特法
依赖注入的另一种可能性是重构为“init”方法,即:

class A
{
    function setB ( B $b = null )
    {
        $this->b = ( !is_null($b) ? $b
            $this->initB()
        );
    }

    function initB ( )
    {
       return new B();
    }

    function someMethod ( )
    {
        return $this->b->getResult();
    }
}

通过此实现,“A”的子类可以重写“initB”来更改依赖关系,并且使用“PHPUnit_Framework_TestCase::getMock()”生成的A的mock可以定义方法的固定返回值,而无需依赖setter的功能(或者可以省略setter).

依赖项注入的另一种可能性是重构为“init”方法,即:

class A
{
    function setB ( B $b = null )
    {
        $this->b = ( !is_null($b) ? $b
            $this->initB()
        );
    }

    function initB ( )
    {
       return new B();
    }

    function someMethod ( )
    {
        return $this->b->getResult();
    }
}

通过这种实现,“A”的子类可以重写“initB”来更改依赖关系,并且使用“PHPUnit_Framework_TestCase::getMock()”生成的A的mock可以定义方法的固定返回值,而无需依赖setter的功能(或者可以省略setter)。

您对mock的理解是什么?如果要测试某个函数,为什么要模拟它?您通常会模拟测试主题的依赖关系,而不是测试主题本身。我犯了一个错误,我想模拟对象类a并测试someFunction。这取决于类B您对模拟的理解是什么?如果要测试某个函数,为什么要模拟它?您通常会模拟测试主题的依赖关系,而不是测试主题本身。我犯了一个错误,我想模拟对象类a并测试someFunction。这取决于类B必须添加:新的可测试类的目标通常应该是摆脱
if$var==null$var new object()将所有代码行放在一起,然后从外部传入。仅仅拥有“仅用于测试的可选性”也可以工作,但通常不是最终目标或所有美好的东西将所有代码行放在一起,然后从外部传入。仅仅拥有“可选的只是测试”也可以工作,但通常不是最终目标或所有的美丽。
class A {
    protected $b;


    public function __construct() {
        $this->b = new B();
    }

    public function setB($b) {
        $this->b = $b;
    }

    public function someFunction() {
        $result = $this->b->getResult();
        return $result;
    }
}
class A
{
    function setB ( B $b = null )
    {
        $this->b = ( !is_null($b) ? $b
            $this->initB()
        );
    }

    function initB ( )
    {
       return new B();
    }

    function someMethod ( )
    {
        return $this->b->getResult();
    }
}