集成测试而不是单元测试


Integration test instead of unit test

假设我有一个自定义集合对象。我如何为remove方法创建一个单元测试(没有依赖关系)?我必须首先调用add方法才能在之后删除该项目,因此remove方法依赖于add方法。在大多数情况下,此自定义集合类将具有包含所有添加的集合项的受保护属性。因此,我不能模拟add方法,因为那样我就没有集合项可以删除了。

class Item 
{
    private $identifier;
    public function __construct($identifier)
    {
        $this->identifier = $identifier;
    }
    public function getIdentifier() { return $this->identifier; }
    ...
}
class customCollection
{
    protected $items = [];  
    public function add($item) {
        $this->items[$item->getIdentifier()] = $item;
    }
    public function remove($item) {
        unset($this->items[$item->getIdentifier()]);
    }
    public function getItems()
    {
        return $this->items;
    }
}

我可以使用对象聚合并将一个集合项数组传递给构造函数,并将其用作自定义集合对象的初始集合项,但如果add方法可能修改多个对象属性,这可能会出现问题。那么你怎么解决这个问题呢还是仅仅用一个积分测试就可以解决这个问题呢?感谢您的反馈!

如果Item足够简单,就不用麻烦复杂了,集成测试就可以了。编写少量测试,先测试Item,然后测试customCollection。如果Item测试运行良好,而customCollection测试失败,则极有可能在收集中存在错误。

如果Item非常复杂,让它实现集合所需的接口,然后您可以用该接口的简单实现来存根Item。然后分别测试Item和普通实现,然后是普通实现的集合,然后是Item实现的集合。(但我怀疑这是否值得。)

分离单元测试和集成测试的关键在于容易定位bug所在的位置。但是,如果您仅通过结构良好的集成测试实现相同的效果,那就很好了。