如何使用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();
}
}