我正在寻找有关如何以纯TDD方式创建
Spring Web应用程序(使用hibernate)的建议.这意味着您不应该首先编写生产代码而不进行失败的单元测试.
您是否会对应用程序上下文的创建进行单元测试?如果是的话你会怎么做呢?
使用java配置而不是基于xml或基于注释的配置时,TDD弹簧应用程序会更容易吗?
解决方法
当您编写需要Spring ApplicationContext和数据库的测试时,这是一个集成测试,而不是单元测试.单元测试的一般规则是:
>他们测试一件事(即对其他类/ bean的方法调用不赞成)
>他们有精简设置(即没有将测试数据加载到数据库中,没有交易,没有巨大的应用程序上下文)
另一方面,集成测试:
>速度慢(创建数据库连接,将测试数据加载到数据库中,大型设置步骤连接多个bean,配置弹簧,……)
>脆弱(因为许多依赖)
>如果它们失败了,你只知道它已经执行了500’000行代码中的某个地方.
因此对于TDD,您尝试构建可以在没有Spring的情况下创建的bean.以这样的方式编写它们,使您不必启动Hibernate或数据库.这里的主要原因是TDD需要每天运行数百次单元测试.如果它们运行时间超过10秒,您最终会觉得您在浪费时间等待测试结束.
接下来的问题通常是如何以这种方式测试任何有用的东西.好吧,这样想吧:Hibernate有效.它已经有很多单元测试.测试hibernate是浪费时间.因此,您应该在应用程序中创建一个完全隐藏Hibernate代码的层.
而不是连接FooDao,连接一个具有byId()方法的IFooDao并返回一个POJO.在单元测试中,您可以创建一个返回单个实例的模拟实现.
当你想知道真正的FooDao是否有效时,为几次调用byId()的函数编写集成测试.
但避免“从DAO获取对象,进程对象,再次使用DAO保存对象”.这是三个不同的测试(两个IT,一个UT).