Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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
Spring 如何将TDD应用于逐层设计的软件包?_Spring_Rest_Tdd_Persistence_Integration Testing - Fatal编程技术网

Spring 如何将TDD应用于逐层设计的软件包?

Spring 如何将TDD应用于逐层设计的软件包?,spring,rest,tdd,persistence,integration-testing,Spring,Rest,Tdd,Persistence,Integration Testing,我已经读了很多关于TDD的书,特别是关于各种实践和经验,注意事项和不注意事项,在尝试将它应用到一个具有持久性和REST的Spring Boot应用程序上后,我仍然对几个方面感到困惑,所有这些都是由特性打包的 StackOverflow上的许多博客帖子和答案建议我们应该测试接口,而不是实现。 然而,像Steve Freeman和Nat Pryce的“由测试引导的不断增长的面向对象软件”中的例子表明了完全不同的方法, 因为所有这些测试都主要测试实现,断言方法调用的数量等等,所以我们的测试实际上依赖于

我已经读了很多关于TDD的书,特别是关于各种实践和经验,注意事项和不注意事项,在尝试将它应用到一个具有持久性和REST的Spring Boot应用程序上后,我仍然对几个方面感到困惑,所有这些都是由特性打包的

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
我的第一个想法是:

  • 编写一个简单的REST集成测试来测试 信息控制器
  • 用这些创建InformationRestController 映射
  • 为BasicInformationService创建测试,创建 BasicInformationServiceImpl对象,模拟BasicInformationRepository 并测试存储库的save方法是否只被调用一次
  • 为BasicInformationService创建类, BasicInformationServiceImpl和BasicInformationRepository 基本信息道
  • 重构、实现细节、dto和dao 田野等
  • 如果我以后决定使用存储库的saveAndFlush怎么办?因为这么小的变化而需要重构单元测试是正常的吗? 如果我只测试接口,如何测试具有不同依赖关系的不同实现

    那么,如果使用TDD,一个设计(例如,BasicInformationService的save方法)只将一个DTO对象映射到一个DAO,然后使用BasicInformationRepository将其持久化,那么它将如何进行设计呢?

    简而言之,BDD(行为驱动开发)是TDD的一种改进,它从测试整个堆栈的验收测试开始,然后在必要时通过单元测试测试详细信息。在您给出的例子中,我怀疑没有必要对大多数组件进行单元测试


    在执行TDD/BDD时,以已知设计为目标是完全正常的,因为您的框架需要它,或者因为该设计已经在程序的其他垂直部分中建立。只有最极端的TDDER开始时没有框架。你不想做的是构建一个框架不需要的大设计,而测试和重构还没有告诉你你需要什么。

    我对Spring一无所知,但似乎你已经设计了所有的类,然后尝试使用TDD进行开发。TDD的思想是,你不需要预先设计类,而是让设计随你去。好吧,我想这是一种混合的技术,因为使用方法包技术,你可能会预见到这种结构,或者至少在进行TDD时记住它。我只是想知道,当CRUD存储库开始使用时,人们实际上是如何进行TDD的。它们已经足够抽象了,但我们不能真的嘲笑它们是现实的。所以,我如何使用TDD为在实现中使用CRUD存储库接口的服务设计代码,因为我发现“服务应返回与存储库相同的id”之类的测试根本没有用处?