Unit testing 接缝和接缝

Unit testing 接缝和接缝,unit-testing,mocking,phpunit,Unit Testing,Mocking,Phpunit,所以我决定研究在PHPUnit中使用接缝,但我遇到了一个问题 我重新安排了我的类,打破了对数据库类的依赖关系 db_Class::getMyData($vars); 变成 self::getMyData($vars); 我在代码中添加了函数 protected static function getMyData($vars) { return db_Class::getMyData($vars); } 这样做是为了创建一个继承该类并重载getMyData函数的类。能够在运行测试用例

所以我决定研究在PHPUnit中使用接缝,但我遇到了一个问题

我重新安排了我的类,打破了对数据库类的依赖关系

db_Class::getMyData($vars);
变成

self::getMyData($vars);
我在代码中添加了函数

protected static function getMyData($vars) {
    return db_Class::getMyData($vars);
}
这样做是为了创建一个继承该类并重载getMyData函数的类。能够在运行测试用例时更改它

例如,在seam类中,它扩展了上面的类并重载了该函数:

protected static function getMyData($vars) {
    return array('id'=>1, 'name'=>"My Name");
}
这将非常有用,因为我可以随意更改数据。但是,当使用PHPUnit时,您可以使用$this->getMock和类似工具运行mock。我是否能够在seam类中实现这一点

我正在尝试寻找一种解决方案,在这种解决方案中,我不使用依赖性注入器,这将是我的另一种选择,一点也不坏,只是想评估两种选择

Michael C.Feathers表示接缝如下:

A seam is a place where you can alter behavior in your program without editing in that place.
因此,我可能无法了解全部情况,我已经尝试了解了一段时间,但我无法了解它。如果您有任何想法或问题,请发表评论

我要求的是一种在不同场景中轻松使用mock的方法。我并不总是希望在seam中返回相同的值,有时我希望返回null以获得错误,有时是一个包含正确数据的数组,有时可能是其他的


谢谢

因为在调用静态方法时必须直接引用类,所以不能像重写非静态方法那样重写它们。我不想重复上面写的内容,我强烈建议您按照答案中的链接进行操作


无论如何,为什么这个方法是静态的?由于受到保护,您只能从同一类或其子类调用它。你能在这里发布更多的上下文吗?您打算如何使用它,在哪里测试它?你能把它改成非静态的吗?

我在这里找到了我问题的答案:


这里的想法是,您可以准备可测试版本的
X
,其中唯一被覆盖的是
getMyData

protected static function getMyData($vars) {
    return $some_dummy_data;
}
您可以通过
TestX
间接地为
X
编写测试。
现在,让我们假设您在原始
X
中更改了一些会破坏它的内容
TestX
确实继承了损坏的代码,因此其测试失败。正是我们想要的

我在下面提供了一个链接,指向我想要实现的目标