当前位置: 首页 > 知识库问答 >
问题:

如何将TDD应用于逐层封装设计?

徐隐水
2023-03-14

我读了很多关于TDD的文章,特别是关于各种实践和经验、应该做的和不应该做的,在尝试将它应用到Spring Boot应用程序上之后,我仍然对几个方面感到困惑,这些应用程序都是通过Feature打包的。

这里关于StackOverflow的许多博文和答案都建议我们应该测试接口而不是实现。然而,例如Steve Freeman和Nat Pryce的《面向对象的软件成长,由测试引导》中的例子,提出了一种完全不同的方法,因为它们都主要测试实现,断言方法调用的数量等等。所以我们的测试实际上变得依赖于实现本身。当然,我们可以使用控制反转--通过构造函数传递依赖项,并在测试中模拟它们,但模拟(比方说)CRUD存储库真的有意义吗?

也许我会给你一个简单的例子来更好地描绘这种情况。假设我们有一个多页用户信息表单,每个表单页都要单独保存。

因此,信息包的计划结构可以类似于以下按功能包的方法:

com
.. example
.... user
...... information
........ basic
.......... + BasicInformationDto
.......... + BasicInformationService
.......... - BasicInformationServiceImpl
.......... - BasicInformationDao
.......... - BasicInformationRepository
........ additional
.......... + AdditionalInformationDto
.......... + AdditionalInformationService
.......... - AdditionalInformationServiceImpl
.......... - AdditionalInformationDao
.......... - AdditionalInformationRepository
........ + InformationRestController

+ is public and - is default access modifier
    null

如果我后来决定使用存储库的#saveandflush怎么办?一个单元测试因为这么小的改动而需要重构,这正常吗?而且如果我只测试接口,我如何测试不同的实现和不同的依赖项来实现它呢?

那么,如果BasicInformationService只将DTO对象映射到DAO并使用BasicInformationRepository持久化,那么如何使用TDD设计BasicInformationService的save方法呢?

共有1个答案

葛昱
2023-03-14

简而言之,BDD(行为驱动开发)是对TDD的改进,它从测试整个堆栈的验收测试开始,然后根据需要用单元测试来测试驱动细节。你可以对每个类进行单元测试,如果你想的话,但你不必这样做,我也不想这样做。在您给出的情况下,我怀疑没有必要对大多数组件进行单元测试。

在执行TDD/BDD时,目标是一个已知的设计是非常正常的,这要么是因为您的框架需要它,要么是因为该设计已经在您的程序的其他垂直切片中建立起来了。只有最极端的tder在没有框架的情况下启动。您不想做的是构建一个框架不需要的、测试和重构还没有告诉您需要的大设计。

 类似资料:
  • 问题内容: 在Python中的lambda函数上使用装饰器有什么语法?例: 结果如下: 但是,当我尝试使用lambda进行相同操作时: 我得到这个: 我觉得这可能是通过允许将语句“插入” lambda使其更通用的好方法。但是,如果存在这样的功能,我不知道语法是什么。 问题答案:

  • 本文向大家介绍Bootstrap被封装的弹层,包括了Bootstrap被封装的弹层的使用技巧和注意事项,需要的朋友参考一下 对于Bootstrap的弹层,插件有很多,今天主要用的是它自带的功能,通过bootstrap提供的模式窗口来实现的,而小编主要对使用方法进行了封装,开发人员可以自己动态传入弹层的HTML内容,可以控制按钮的显示与隐藏,用户通过MVC扩展方法对弹层进行生成,然后使用A标签进行调

  • [source] TimeDistributed keras.layers.TimeDistributed(layer) 这个封装器将一个层应用于输入的每个时间片。 输入至少为 3D,且第一个维度应该是时间所表示的维度。 考虑 32 个样本的一个 batch, 其中每个样本是 10 个 16 维向量的序列。 那么这个 batch 的输入尺寸为 (32, 10, 16), 而 input_shap

  • 我一直在研究封装的概念,发现了一些关于这个主题的不错的线索,比如这个和这个。但我还没能找到一个具体问题的答案。我将使用Swift中的一个示例。 假设你有一个RoadTrip类型的对象: 现在让我们假设应用程序将计算,这是唯一的公共属性: 每加仑平均英里数的计算是RoadTrip对象执行和更新其的私有方法,还是可以接受由单独实用程序类中的另一个方法执行计算,然后更新RoadTrip的属性对象是否使用

  • 我有工作的spring基于web的应用程序。现在我想在另一个项目中重用它的部分。因此,我有两个问题: 推荐什么方法来打包可重用库这样的功能?内部包含应用程序上下文XML的JAR文件还是JAR+extra XML?还有别的吗? 如何将这样的库合并到另一个基于spring(Web)的项目(不同的命名空间包)中,从而使能够工作?我想类路径上的简单JAR是不够的--如何引用库的应用程序上下文等等?还需要采

  • 问题内容: 我从Java开始,正在学习有关setter,getter和封装的知识。我有一个非常简单的程序,分为两个类: 的setter和getter 有一个私有的int数组()。 创建一个对象并在方法中使用它。 问题:我可以通过getter更改private int数组,我知道那是因为返回对的引用,而不是数组本身。如果我对数组的单个元素感兴趣,我会用一个索引值来做一个吸气剂,但是我想要方法的整个数