为什么静态方法是难以测试的?如果可以,请用 PHP 举例说明。
静态方法本身并不是无法测试的,但如果被测试的对象调用了一个静态方法,那么测试就无法"介入"并使其调用存根方法。如果被测试的对象调用的是一个普通方法,那么测试可以提供一个具有该方法存根实现的替代对象。
一般情况下,刚性依赖关系更难测试,而依赖注入(搜索谷歌)使代码更易于测试。
例如,假设我们有一个静态方法getCurrentUser()
,被正在测试的类使用,如下所示:
class PostModel {
//...
public function getRecentPosts() {
return $this->database->from('posts')
->where(array('user' => UserModel::getCurrentUser()))
->limit(10);
}
}
现在UserModel::getCurrentUser()
不能被替换成一个存根方法。如果我们将其变为通过对象引用调用的常规方法,我们就可以在测试中传入一个替代的存根对象。
class PostModel {
private $userModel;
public function __construct($userModel) {
$this->userModel = $userModel;
}
//...
public function getRecentPosts() {
return $this->database->from('posts')
->where(array('user' => $this->userModel->getCurrentUser()))
->limit(10);
}
}
良好定义的静态
方法是完全可测试的。你看,问题不在于方法本身,而在于方法的依赖关系。如果该方法及其依赖项(以及依赖项的依赖项)是idempotent,那么就没有问题。问题出现在你的静态
方法调用其他方法时,例如依赖于全局变量
的方法。