我的问题是关于单元测试。假设我们有下面的类;
class X
{
public function p1(){
//logic
$a = $this->p2();
//more logic
}
public function p2(){
//even more logic
}
}
为 p1 方法编写单元测试时,我应该模拟 p2 方法吗?
我在想的是,为 p1 方法编写的测试应该只执行和测试 p1 方法而不是 p2。但是为了实现我应该得到一个 X 类的模拟并在该模拟实例上调用 p1 方法,如下所示。
$xMock = $this->getMockBuilder('\X')
->setMethods(array('p2'))
->getMock();
$xMock->expects($this->any())
->method('p2')
->will($this->returnValue($value));
$resultTobeAsserted = $xMock->p1();
不幸的是,这样做对我来说有点不对劲。我和我的同事讨论了这个话题,它归结为你如何定义你的 SUT(被测系统)。如果测试人员将正在测试的特定方法视为 SUT,那么从 SUT 调用的其他方法似乎是依赖项,测试人员自然会想要模拟它们。另一方面,如果测试人员将整个类视为 SUT,那么这些方法调用将成为测试的一部分,因此没有任何理由模拟它们。
这个结论正确吗?哪种思维会产生更健壮的单元测试?