【问题标题】:How would you approach TDD-ing a spring web application [closed]您将如何处理 TDD-ing Spring Web 应用程序 [关闭]
【发布时间】:2013-09-04 16:27:43
【问题描述】:

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

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

使用 java 配置而不是基于 xml 或注解的配置时,TDD 一个 Spring 应用会更容易吗?

【问题讨论】:

    标签: java spring hibernate spring-mvc tdd


    【解决方案1】:

    当您编写需要 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)。

    【讨论】:

    • 因此,您建议例如从一个测试开始,该测试正在测试一个例如调用其他服务的控制器,模拟该其他服务,然后编写一个新测试来测试该服务以此类推,直到您实现目标?
    • 是的。 TDD 最重要的核心价值之一是“小步骤”。当一个测试执行超过 100 行代码时,这几乎不是一个“小步骤”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 2010-10-02
    • 2010-09-06
    • 2019-08-14
    相关资源
    最近更新 更多