- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设一个名为 Sprinter
的类:
public class Sprinter {
protected int travelMeters;
public void run(int seconds) {
this.travelMeters = 9 * seconds;
}
public int getTravelMeters(){
return travelMeters;
}
}
还有一个 SprintGenius
类型继承 Sprinter
:
class SprintGenius extends Sprinter {
public void run(int seconds) {
this.travelMeters = 10 * seconds;
}
}
逻辑上,必须创建 2 个单元测试类,每种类型一个。
在 Sprinter
单元测试中,我最终会得到:
@Before
public void setUp() {
Sprinter sprinter = new Sprinter();
}
public void testSprinterShouldRun90metersWithin10Seconds() {
sprinter.run(10);
assertEquals(sprinter.getTraveledMeters(),90);
}
在 SprintGenius
单元测试中,我最终会得到:
@Before
public void setUp() {
Sprinter sprinter = new SprintGenius();
}
public void testSprinterShouldRun100metersWithin10Seconds() {
sprinter.run(10);
assertEquals(sprinter.getTraveledMeters(),100);
}
在上面的两个测试中,我都会在 10 秒内测试行进的米数。
显然,这两个测试都是绿色的。
但是,违反里氏替换原则怎么办?
事实上,任何客户端代码都应该期望任何短跑运动员在 9 秒内跑完 10 米。
3 个解决方案(前两个解决方案已向所有团队的开发人员发出规则,并且必须承认并保留,即使不是每个人都很好地掌握 Liskov 的概念)
1) 在 Sprinter
类中,重复每个测试,但这次基于 Sprinter sprinter = new SuperGenius()
并期望 90 米。 => 什么应该失败,这正是我们想要的! => 防止违反 Liskov 原则。
2) 在SprintGenius
类中,始终基于完全相同的期望添加基于基类的每个测试的类似“克隆”。因此,如果您有 2 个不同的测试,我们最终会得到 4 个测试。 2 将 Sprinter 声明为 Sprinter
并 2 将 Sprinter
声明为 SprintGenius
。
3) 从不从具体类继承(我想这是你阅读这篇文章的第一 react :)),如果合适的话,更喜欢组合!这样就不会出现这个问题。
基于许多开发人员忽略 Liskov 原则并且经常试图从具体类继承而不是使用另一种更好的方法(如组合或不同的继承层次结构)这一事实,防止违反 Liskov 替换原则的最佳实践是什么?
我不想因为开发人员继承了我编写的类(没有告诉我......),将它注入(inject)到一个共享的巨大的异构 Sprinter
列表中并面对我说“你好奇怪的行为!”和数小时的调试时间...
我当然不想将我所有的具体类都声明为“final”:)
最佳答案
单元测试是关于特定模块的测试,不能也不应该用于比这更广泛的事情。遵守 Liskov 替换原则是系统范围内的一个更广泛的问题,而不是模块范围内的问题。而且,它不是要在代码中测试的东西。这是一个纯粹的设计问题,与实现无关。我不认为 LSP 可以通过自动工具强制执行。它应该在设计审查期间处理,然后在代码审查期间处理(应该检查是否符合设计)。
关于java - 对 Liskov 替换原则的合规性进行单元测试是一种好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13194154/
是否有任何关于使 WPF 应用程序符合 508 标准的好的指南?例如,是否每个文本输入框都需要通过某种标签类型(如网页)与标签相关联? 最佳答案 有this white paper在 WindowsC
是否可以在 Heroku 上运行符合 HIPAA 的应用程序?更具体地说,我需要两个应用程序,一个存储成员(member)信息,另一个存储成员(member)的私有(private)健康信息。我打算使
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 5 年前。 Improve this ques
我有点困惑。我在服务器上将内容类型切换为 application/xhtml+xml ,因为我使用的是 XHTML + 一些额外的属性(使用 设置)。自从我这样做之后,一切都乱了套。 例如,我有一个
我创建了一个 Ad Publisher iOS SDK,它将显示底部横幅广告。它是使用 iOS 的原生组件创建的,例如 UIView、UIImageView、UIButton 等。我想让它符合 MRA
我想大多数人都同意遵守 W3C 标准是值得的追求。 但是,您是否宣传您的网站合规这一事实?这样做有好处还是坏处? 如果你确实表现出你的合规性,你会怎么做? 最佳答案 我不知道,因为普通用户不知道网站“
如果我尝试预取核心数据中的相关实体,我会遇到抛出 KVO 异常的问题。这对我来说没有任何意义,而且我似乎无法在简化的项目中复制该行为。我的目标是 10.8 并使用 ARC。 我的数据模型是一个音乐库,
Posix 合规性是许多公司遵循的标准。 我对这个领域没有什么疑问, 1. 是否所有文件系统都需要符合 posix 标准? 2. 应用程序是否也需要符合 posix 标准? 3. 有没有非posix
我想知道存在哪些边缘情况可以使 Common Language Specification compliance可接受的。即使不打算从其他语言访问,我认为 CLSCompliantAttribute
最近出现了 508 合规性问题。我开始阅读一些 WCAG 和 508 指南。 我们看到是否讨论了关于数量比例的建议: http://www.socialsecurity.gov/accessibili
我正在与一个新客户合作一个项目,由于业务类型的原因,他们在获取商家帐户来处理在线支付时遇到了一些问题。该系统的工作方式与 Just Eat/Expedia 等类似,因为客户在网站上下订单,然后将订单传
在循环内实例化对象是每个开发人员常用的方法。 我们在循环内实例化具有不同泛型和集合类型的不同对象,这是不建议的。定义一个私有(private)方法来获取实例可以解决这个问题。但我正在寻找实现相同目标的
我正在开发一个购物车,如果可能的话,我想存储: 名字帐单地址 zip 进入 MySQL 数据库。这很好,因为回头客不必在每次结账时重新输入账单信息。我不会存储任何信用卡数据。 这样做会违反 PCI 标
我正在开发一个网站以实现 ADA 合规性。就 ADA 合规性而言,哪种方法更好: Name: 对比 Name: 对于其他输入类型类似,例如选择、单选按钮、复选框等。 此外,根据设计,我们在
我的目标是通过 PayPal 设置定期付款,并使用 PayPal 帐户和没有帐户的信用卡进行付款;我无法理解第二部分:为了不自己处理 PCI 合规性,我必须从 PayPal 购买/支付什么产品(支付流
我有一个 webview,它显示我在运行时生成的一些 HTML。这个 html 在 chrome 和 IE 中工作,但是当我尝试将它加载到 webview 中时,它告诉我“网页不可用”我正在使用基本的
我有几个我脚本中的标签。对于内部文件系统中的所有 js 文件,我使用如下命令 - cat jquery.js | openssl dgst -sha384 -binary | openssl base
我不知道去哪里解决 PCI 合规性问题,所以我想我会试一试。如果有人可以指出我可以去哪里提问的正确方向,请分享。我也很乐意将其标记为答案。 如果符合 PCI 标准的网站连接到一个数据库,该数据库不存储
我正在专业地开发一个包含联系人和其他数据的 php 网络应用程序。我想知道使用 LDAP 协议(protocol)将这些数据提供给外部程序有多难。 有专门的工具吗?我真的找不到任何东西,但我无法想象我
我安装了 Java 7,但将我的项目 JDK 合规性设置为 Java 6。不幸的是,这与使用 Java 6 编译不同。 例如接口(interface)javax.imageio.stream.Imag
我是一名优秀的程序员,十分优秀!