【问题标题】:@SpringBootTest Vs @WebMvcTest & @DataJpaTest &service unit tests, what is the best?@SpringBootTest 与 @WebMvcTest & @DataJpaTest &service 单元测试,什么是最好的?
【发布时间】:2019-11-28 23:08:25
【问题描述】:

我有一个 SpringBoot MVC 应用程序,我想用测试来覆盖它。

我有控制器、服务和存储库层。

通过测试覆盖应用程序的最佳做法是什么?

为什么人们使用@SpringBootTest,而它似乎可以通过@WebMvcTest@DataJpaTest 和服务单元测试进行分层测试?它更快、更细化,不是吗?

AFAIK 在使用@SpringBootTest 时称为集成测试,这是否意味着它不应该经常出现?

我想每一块代码都应该被单元测试覆盖,集成覆盖也一样吗?或者集成测试应该在舞台环境中工作而不是在测试环境中工作?

如果我创建一个@SpringBootTest 但模拟其他层,这不一样吗(在性能方面)? (假设我创建多个@SpringBootTests 并模拟其他层)。

【问题讨论】:

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


    【解决方案1】:
    • @SpringBootTest 加载完整的应用程序上下文,就像您在运行 Spring Boot 应用程序时启动 Spring 容器的方式一样。

    • @WebMvcTest 仅加载 web 层,其中包括用于处理请求/响应的安全性、过滤器、拦截器等。通常,您会为 @Controller@RestController 下的方法编写测试。

    • @DataJpaTest 仅加载 JPA 的配置。如果没有另外指定,它使用嵌入式内存 h2。

    • 理想情况下,服务层测试不应有任何注释(有助于模拟的注释除外),因为这是您的业务逻辑(独立于任何配置)所在的位置。

    关于最佳实践,它实际上只是关注点分离。我很少使用@SpringBootTest,除非它是为了在我的本地进行一些临时集成测试。 @WebMvcTest 之类的注解让您的测试更加“模块化”并且速度稍快。

    【讨论】:

    • 如果创建@SpringBootTest 但模拟其他层,这不一样吗(在性能方面)? (假设我创建多个(a)SpringBootTest 并模拟其他层 - 逐层 - )
    • 在性能方面,@WebMvcTest@SpringBootTest 更快,因为它只加载控制器所需的组件。 @SpringBootTest(加载完整的应用程序)实例化并注入所有 bean,无论您提供什么模拟。这里的好习惯是使用@WebMvcTest 来测试控制器并模拟来自其他层的任何依赖关系。
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2010-09-12
    • 2010-09-08
    • 2020-01-10
    • 2020-08-16
    • 2013-07-03
    • 1970-01-01
    相关资源
    最近更新 更多