为什么静态方法不可测试?

2022-08-31 01:01:25

为什么静态方法不可测试?请举例说明(如果可能的话,用PHP)。


答案 1

静态方法本身并非不可测试,但是如果被测试的对象调用静态方法,则测试不能“介于两者之间”并使其调用存根方法。如果被测试的对象改为调用常规方法,则测试可以为其提供一个具有该方法的存根实现的替代对象。

一般来说,刚性依赖关系的可测试性较差,而依赖注入(谷歌它)使代码更具可测试性。

例如,假设我们有一个由我们正在测试的类使用的静态方法,如下所示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);
    }
}

答案 2

静态方法是可测试的:http://sebastian-bergmann.de/archives/883-Stubbing-and-Mocking-Static-Methods.html(它在php中),但是如果你想测试类之间的交互(即使用模拟和假对象),你可能宁愿不使用它。话虽如此,phpunit 3.5允许您存根这些。

您可能还想看看什么时候在php中使用静态变量/函数?或搜索有关何时使用静态方法的一些信息。

我在类中使用静态方法(即标记为私有或受保护),因为它们在我使用的语言中更快。


推荐