如何正确测试Spring启动应用程序?

时间:2017-07-16 09:41:53

标签: spring unit-testing spring-mvc spring-boot integration-testing

这是一种建筑和一个广泛的问题。

我有一个有三层的弹簧休息应用程序。 (1)前端控制器(其余或mvc控制器),(2)控制器和DAO之间的服务层,(3)DAO层,在我的例子中是弹簧数据jpa存储库。现在,问题是,我已经使用带有测试切片的@WebMvcTest为控制器编写了集成测试。对于DAO层,我使用@DataJpaTest,它是JPA存储库的切片测试。服务层是普通的java类,因此我只使用模拟DAO进行单元测试。

  1. 现在,是否还有充分的理由进行完整的集成测试,这将启动整个容器并点击数据库?

  2. 我还在我的应用程序中发送SpringApplicationEvents。有没有必要测试它们是否正常工作?如果是,怎么做?

  3. 服务层还控制交易。再次,是否需要测试交易是否按预期工作,以及如何?

  4. 提前致谢

1 个答案:

答案 0 :(得分:2)

  1. 当然,使用您要在生产环境中使用的数据库来测试业务代码总是一个好主意,尤其是在使用(本机)查询和/或触发器时。数据库的行为可能与H2或HSQL等可用的内存中垂饰不同。此外,冲洗行为/检查约束的时刻在内存和"原生"之间不同。 dbs和每种方言都会引发不同类型的例外。
  2. 封装,分别。简化测试数据库处理(设置/清理)可能需要查看Testcontainers

    1. 你不必测试事件机制本身,Spring家伙(和gals)希望在发布它之前就已经做过了,如果你相信它们,事件应该起作用(一般情况下)。当然总有一个bug,但是如果你开始测试每个框架功能,你就永远不会把它投入生产。除了这个论证之外,测试事件可以使用位于src/test/java包下面的监听器来处理,该监听器监听业务代码触发的事件。在制作中,这个测试听众不会损害应用程序。至少对于同步事件来说这很容易,如果是关于异步事件,它会变得棘手。
    2. 也许Awaitility可以提供帮助。

      1. 在我看来,测试交易属于低水平"在Spring Boot应用程序中进行测试。但同样,您应该测试您的应用程序是否正常运行,例如如果引发异常并且您希望回滚数据库状态。但交易机制本身应该是 由数据库维护人员测试。如果它是一个完善的产品(Oracle,PostgreSQL,MySQL),它应该进行测试并按预期工作。