你将如何处理一个弹簧网络应用程序的TDD

时间:2013-09-04 16:27:43

标签: java spring hibernate spring-mvc tdd

我正在寻找有关如何以纯TDD方式创建Spring Web应用程序(使用hibernate)的建议。这意味着您不应该首先编写生产代码而不进行失败的单元测试。

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

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

1 个答案:

答案 0 :(得分:12)

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

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

另一方面,集成测试:

  • 很慢(创建数据库连接,将测试数据加载到数据库中,大设置步骤连接多个bean,配置spring,...)
  • 脆弱(因为有许多依赖)
  • 如果它们失败了,你只会知道它已经执行了500'000行代码。

因此对于TDD,您尝试构建可以在没有Spring的情况下创建的bean。以这样的方式编写它们,使您不必启动Hibernate或数据库。这里的主要原因是TDD需要每天运行数百次单元测试。如果它们的运行时间超过10秒,您最终会觉得您在浪费时间等待测试结束。

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

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

当您想知道真实FooDao是否有效时,请为几次调用byId()的内容编写集成测试。

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