6

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

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

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

4

1 回答 1

12

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

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

另一方面,集成测试:

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

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

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

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

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

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

于 2013-09-04T16:35:38.293 回答