Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 协调单元测试与OOD_Unit Testing_Tdd_Oop - Fatal编程技术网

Unit testing 协调单元测试与OOD

Unit testing 协调单元测试与OOD,unit-testing,tdd,oop,Unit Testing,Tdd,Oop,如今,TDD风靡一时,越来越多的软件商店正在转向敏捷、scrum等。我当然可以看到自动化测试的优势,但我也认为TDD与良好的面向对象设计的一些原则相矛盾 TDD要求您在代码中插入接缝,通过接口公开实现细节。依赖项注入或协作者注入违反了信息隐藏的原则。如果您的类使用collaborator类,那么这些collaborator的构造应该在类内部,而不是通过构造函数或接口公开 我还没有看到任何文献讨论编写可测试代码与同时遵守封装、简单性和信息隐藏原则之间的冲突。这些问题是否以标准方式得到解决?根据所讨

如今,TDD风靡一时,越来越多的软件商店正在转向敏捷、scrum等。我当然可以看到自动化测试的优势,但我也认为TDD与良好的面向对象设计的一些原则相矛盾

TDD要求您在代码中插入接缝,通过接口公开实现细节。依赖项注入或协作者注入违反了信息隐藏的原则。如果您的类使用collaborator类,那么这些collaborator的构造应该在类内部,而不是通过构造函数或接口公开


我还没有看到任何文献讨论编写可测试代码与同时遵守封装、简单性和信息隐藏原则之间的冲突。这些问题是否以标准方式得到解决?

根据所讨论的语言,可以做一些事情来集成TDD和OOP。在Java中,可以使用反射来测试私有功能,测试可以放在同一个包中(最好放在单独的源代码树中),以测试包私有功能。就个人而言,我更喜欢只通过相关代码的公共API测试功能


我不知道关于这个主题的任何“官方”资源,尽管我知道他已经就TDD主题写了大量的文章,并且认为它与他的OOP的“可靠”原则是一致的。

也许因为这是一个错误的二分法,所以几乎没有文献

TDD要求您在代码中插入接缝,通过接口公开实现细节

否,用于注入依赖项的构造函数或方法不必是调用类使用的接口的一部分:

class Zoo {
    Animal exhibit;
}

interface Animal {
    void walk();
}

class Dog extends Animal {
    DogFood food;

    Dog(DogFood food) {
        this.food = food;
    }
}
如果您的类使用collaborator类,那么这些collaborator的构造应该在类内部,而不是通过构造函数或接口公开


在上面的例子中,
动物园
无法访问
狗粮
,因为它在喂完狗后得到了
狗粮
狗不暴露食物。

你认为是实现细节的方法和类是真正的接缝,它们代表轴,你可以沿着轴改变组件并将组件重新组合成新的星座

关于封装的经典想法往往过于粗粒度,因为当隐藏大量移动部件时,也会使代码变得非常不灵活。它也倾向于违反许多原则——最突出的是法律

大多数面向对象的设计模式往往是细粒度的,并且很好地符合坚实的原则,这是正确的面向对象设计是细粒度的另一个指标

如果您的类使用collaborator类,那么这些collaborator的构造应该在类内部,而不是通过构造函数或接口公开

这是两种不同的东西混合在一起。我同意在大多数情况下,不应通过接口公开协作者。但是,通过构造函数公开它们是正确的做法


如果希望保留粗粒度API以实现默认功能,您仍然可以通过提供。有关更多详细信息,请参阅本文:

马克·希曼的答案非常好。工业中的“单元”经常会破坏系统,并且由于所有内部硬连线的依赖性,使得系统难以维护。TDD很好地暴露了这样的缺陷。然后可以像乐高积木一样构建单元,形成更大的功能单元,实际执行有用的业务逻辑。实际上,我认为TDD非常支持构建好的OO系统


不要太担心隐藏东西。将
private
理解为“不允许您访问此文件”而不是“系统当前不需要访问此文件”。小心地使用它-通常用于在错误的时间从外部访问会破坏对象状态的东西。

以我的经验,TDD非常支持面向对象设计的原则

依赖注入不是TDD的产物,它通常用于OO框架的设计中,而与开发方法无关

依赖项注入是关于松散耦合的-如果类A使用类b中的一个或多个对象,那么好的设计将最小化类A对类b内部的了解。我相信这就是您在提到“信息隐藏”时所指的

考虑如果类B改变了它的实现会发生什么。或者,更复杂但仍然常见的情况是,如果您希望根据情况动态替换B的不同子类(例如,您可能使用策略模式),但做出此决定的类不是类a,该怎么办

因此,Java有接口。不是让类A依赖于类B,而是让它依赖于类B实现的接口。然后可以替换实现该接口的任何类,而无需更改

这包括,但不限于,为测试目的替换假对象


TDD绝对使用依赖注入。就像TDD利用了OO的许多原理一样。但是DI是OO的原理,而不是TDD的原理。

当使用依赖注入时,对象构造和对象图管理将在工厂中处理。对象是通过工厂创建的,因此对象创建者不会知道所创建类的依赖关系

例如,如果类A具有通过构造函数传递的依赖项B和C,则B和C将由工厂方法提供。创建A的对象将不知道对象B和C

依赖注入框架类似于automat,并且可以用于automat