Java 您如何使用SpringWeb应用程序实现TDD

Java 您如何使用SpringWeb应用程序实现TDD,java,spring,hibernate,spring-mvc,tdd,Java,Spring,Hibernate,Spring Mvc,Tdd,我正在寻找关于如何以纯TDD方式创建SpringWeb应用程序(使用hibernate)的建议。这意味着您不应该在没有单元测试失败的情况下编写生产代码 您是否会对应用程序上下文的创建进行单元测试?如果是的话,你会怎么做 当使用java配置而不是xml或基于注释的配置时,TDD spring应用程序会更容易吗?当您编写一个需要springApplicationContext和数据库的测试时,那么这是一个集成测试,而不是单元测试。单元测试的一般规则如下: 他们测试一件事(即,不赞成对其他类/bea

我正在寻找关于如何以纯TDD方式创建SpringWeb应用程序(使用hibernate)的建议。这意味着您不应该在没有单元测试失败的情况下编写生产代码

您是否会对应用程序上下文的创建进行单元测试?如果是的话,你会怎么做


当使用java配置而不是xml或基于注释的配置时,TDD spring应用程序会更容易吗?

当您编写一个需要spring
ApplicationContext
和数据库的测试时,那么这是一个集成测试,而不是单元测试。单元测试的一般规则如下:

  • 他们测试一件事(即,不赞成对其他类/bean的方法调用)
  • 他们有一个精简的设置(即没有将测试数据加载到数据库中,没有事务,没有庞大的应用程序上下文)
另一方面,集成测试:

  • 速度慢(创建数据库连接、将测试数据加载到数据库、连接多个bean的大设置步骤、配置spring等等)
  • 脆性(由于许多依赖性)
  • 如果它们失败了,您只知道它在执行的50万行代码中的某个地方
所以对于TDD,您尝试构建无需Spring即可创建的bean。编写它们时,不必启动Hibernate或数据库。这里的主要原因是TDD每天需要运行数百次单元测试。如果它们运行时间超过10秒,您最终会觉得等待测试完成是在浪费时间

下一个问题通常是如何以这种方式测试任何有用的东西。好吧,这样想:Hibernate工作。它已经有许多单元测试。测试hibernate是浪费时间。因此,您应该在应用程序中创建一个完全隐藏Hibernate代码的层

与其连接
FooDao
,不如连接一个
IFooDao
,该IFooDao具有
byId()
方法并返回POJO。在单元测试中,可以创建返回单个实例的模拟实现

当您想知道真正的
FooDao
是否工作时,请为调用
byId()
的对象编写几次集成测试


但要避免“从DAO获取对象、处理对象、再次使用DAO保存对象”。这是三个不同的测试(两个IT,一个UT)。

因此,您建议,例如,从测试调用其他服务的控制器开始,例如,模拟其他服务,然后编写新的测试来测试该服务,依此类推,直到您达到目标为止?是的。TDD最重要的核心价值之一是“小步走”。当一个测试执行100多行代码时,这几乎不是一个“小步”。