为什么静态方法不可测试?请举例说明(如果可能,在 PHP 中)。
3 回答
静态方法本身不是不可测试的,但是如果被测试的对象调用静态方法,那么测试就不能“介于两者之间”并使其调用存根方法。如果被测试的对象改为调用常规方法,则测试可以为其提供具有该方法的存根实现的替代对象。
通常,刚性依赖项的可测试性较差,而依赖项注入(google it)使代码更具可测试性。
例如,假设我们有一个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);
}
}
静态方法是可测试的:http ://sebastian-bergmann.de/archives/883-Stubbing-and-Mocking-Static-Methods.html (它在 php 中),但如果你想测试类之间的交互作用(即使用模拟和假对象)你可能不喜欢使用它。话虽如此,phpunit 3.5 允许您存根这些。
您可能还想看看我什么时候在 php 中使用静态变量/函数?或搜索有关何时使用静态方法的一些信息。
我在类中使用静态方法(即标记为私有或受保护),因为它们在我使用的语言中更快。
定义明确的 Static
方法是完全可测试的。你看,问题不在于方法本身,而在于方法的依赖关系。如果方法及其依赖项(以及依赖项的依赖项)是幂等的,那么就没有问题。当您的Static
方法调用其他方法(例如,依赖于global
.