Spring 官方建议的在 Spring Boot 应用中如何做单元测试

这篇具有很好参考价值的文章主要介绍了Spring 官方建议的在 Spring Boot 应用中如何做单元测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring Boot 提供了丰富的测试功能,主要由以下两个模块组成:

● spring-boot-test:提供测试核心功能。

● spring-boot-test-autoconfigure:提供对测试的自动配置。

Spring Boot 提供了一个 spring-boot-starter-test一站式启动器,如以下依赖配置所示。

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
</dependency>

测试启动器依赖不仅包含以上两个 Spring Boot模块,还包含 Spring Test 测试模块,以及其他

第三方测试类库,如下所示。

● JUnit 5:Java 最主流的单元测试框架。

● AssertJ:一款快速断言库。

● Hamcrest:一款单元测试匹配库。

● Mockito:一款 Mock 测试框架。

● JSONassert:一款 JSON 断言库。

● JsonPath:一款 JSON XPath 库。

更多测试相关的依赖可见具体的依赖关系树,如下图所示。

Spring 官方建议的在 Spring Boot 应用中如何做单元测试

以上这些都是 Spring Boot 提供的常用的测试类库,如果上面的测试类库还不能满足你的需要,也可以任意添加以上没有的类库。

现在基本上使用的是 JUnit 5,如果应用还在使用JUnit 4 写的单元测试用例,那么也可以使用JUnit 5 的 Vintage 引擎来运行,如下面的依赖配置所示。

<dependency>
 <groupId>org.junit.vintage</groupId>
 <artifactId>junit-vintage-engine</artifactId>
 <scope>test</scope>
 <exclusions>
     <exclusion>
         <groupId>org.hamcrest</groupId>
         <artifactId>hamcrest-core</artifactId>
     </exclusion>
 </exclusions>
</dependency>

需要排除 hamcrest-core 依赖,因为该依赖已经改坐标了,并且默认内置在Spring Boot依赖管理中,如上面的依赖关系树所示,最新的 Hamcrest依赖已经是org.hamcrest:hamcrest坐标了。

Spring Boot提供了一个 @SpringBootTest 注解,用在单元测试类上以启用支持Spring Boot特性的单元测试,如果使用的是JUnit 4,那么测试类上还需要额外的@RunWith(SpringRunner. class)注解,然后在测试类方法上添加 @Test 注解即可,每一个 @Test 注解修饰的方法就是一个单元测试方法。

@SpringBootTest 注解有一个最重要的 webEnvironment 环境参数,支持以下几种环境设置:

●MOCK(默认):加载一个 Web ApplicationContext 并提供一个 Mock Web Environment,但不会启动内嵌的 Web 服务器,并可以结合 @AutoConfifigureMockMvcor 和 @AutoConfifigure-WebTestClient 注解一起使用进行 Mock 测试。

● RANDOM_PORT:加载一个 WebServerApplicationContext,以及提供一个真实的 WebEnvironment,并以随机端口启动内嵌服务器。

●DEFINED_PORT:和 RANDOM_PORT 一样,不同的是 DEFINED_PORT 是以应用指定的端口运行的,默认端口为 8080。

●NONE:加载一个 ApplicationContext,但不会提供任何 Web Environment。

如果使用的 @SpringBootTest 注解不带任何参数,则默认为 Mock 环境。

真实环境测试

在 @SpringBootTest 注解中指定基于随机端口的真实Web环境,然后在类成员变量或者方法参数上注入 TestRestTemplate 实例,就可以完成对 Spring MVC接口的真实环境测试。

下面是一个基于随机端口的真实环境的测试用例:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MvcTest {
 @Test
 public void getUserTest(@Autowired TestRestTemplate testRestTemplate) {
 Map<String, String> multiValueMap = new HashMap<>();
 multiValueMap.put("username", "Java 技术栈 ");
 Result result = testRestTemplate.getForObject("/user/get?username={username}",
 Result.class, multiValueMap);
 assertThat(result.getCode()).isEqualTo(0);
 assertThat(result.getMsg()).isEqualTo("ok");
 }
 
}

测试当前应用下的 /user/get 接口,传入对应的用户名参数,最后检查接口返回结果是否和预期一致,测试结果如下图所示。

Spring 官方建议的在 Spring Boot 应用中如何做单元测试

单元测试通过,从执行日志可以看到,它启动了一个嵌入式的 Tomcat 容器来测试真实的 Web应用环境。

Mock 环境测试

通过在类上面使用 @AutoConfifigureMockMvc 注解,然后在类成员变量或者方法参数上注入MockMvc 实例,就可以完成对 Spring MVC 接口的 Mock 测试。

下面是一个基于默认 Mock 环境的测试用例:

@SpringBootTest
@AutoConfigureMockMvc
class MockMvcTests {
 @Test
 public void getUserTest(@Autowired MockMvc mvc) throws Exception {
 mvc.perform(MockMvcRequestBuilders.get("/user/get?username={username}", "test"))
 .andExpect(status().isOk())
 .andExpect(content().string("{\"code\":0,\"msg\":\"ok\",\"
data\":\"test\"}"));
 }
}

测试当前应用下的 /user/get 接口,传入对应的用户名参数,最后检查请求状态是否OK(200),响应的内容是否和预期一致,测试结果如下图所示。

Spring 官方建议的在 Spring Boot 应用中如何做单元测试

单元测试通过,从执行日志可以看到,它并未启动真实的 Web 环境来测试,而是使用 Mock 环境测试的。

Mock 组件测试

某些时候可能还需要模拟一些组件,比如某些服务只有上线之后才能调用,在开发阶段不可用,这时就需要 Mock 模拟测试了,提供各种模拟组件以完成测试。

Spring Boot 提供了一个 @MockBean 注解,可为 Spring 中的 Bean 组件定义基于 Mockito 的Mock 测试,它可以创建一个新 Bean 以覆盖 Spring 环境中已有的 Bean,它可以用在测试类、成员变量上,或者 @Confifiguration 配置类、成员变量上,被模拟的 Bean 在每次测试结束后自动重置。

假现现在有一个远程的服务 userService,本地不能调用,现在进行 Mock 测试,如以下使用示例所示。

@SpringBootTest
class MockBeanTests {
// @Autowired
// private UserService userService;
 @MockBean
 private UserService userService;
 @Test
 public void countAllUsers() {
 BDDMockito.given(this.userService.countAllUsers()).willReturn(88);
 assertThat(this.userService.countAllUsers()).isEqualTo(88);
 }
}

这里的 @MockBean 注解使用在 UserService 变量上,表明这个userService实例在当前测试用例中是被 Mock 覆盖的,如果要模拟的 Bean 有多个,则可以使用@Qualififier注解指定,然后通过Mockito 提供的代理工具类方法创建模拟返回数据,运行该服务的测试方法,当模拟数据和预期结果一致时才会测试通过。

这里通过 BDDMockito 工具类模拟 userService#countAllUsers方法并让它返回统计的用户总数(88),最后检查该方法的返回值是否和预期一致,测试结果如下图所示。

Spring 官方建议的在 Spring Boot 应用中如何做单元测试

单元测试通过,也可以使用 @SpyBean 注解代替 @MockBean 注解,两者的区别是:

● @SpyBean—如果没有提供 Mockito 代理方法,则会调用真实的 Bean 来获取数据。

● @MockBean—不管有没有提供 Mockito 代理方法,都会调用 Mock 的 Bean 来获取数据。

@MockBean、@SpyBean 注解既可作用于 Mock 环境,也可作用于真实环境,它只是用来模拟、替换环境中指定的 Bean 而已,但不能用于模拟在应用上下文刷新期间 Bean 的行为,因为在执行测试用例时应用上下文已经刷新完成了,所以不可能再去模拟了,这种情况下建议使用 @Bean 方法来创建模拟配置。文章来源地址https://www.toymoban.com/news/detail-473783.html

到了这里,关于Spring 官方建议的在 Spring Boot 应用中如何做单元测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何创建自己的Spring Boot Starter并为其编写单元测试

    当我们想要封装一些自定义功能给别人使用的时候,创建Spring Boot Starter的形式是最好的实现方式。如果您还不会构建自己的Spring Boot Starter的话,本文将带你一起创建一个自己的Spring Boot Starter。 创建一个新的 Maven 项目。第三方封装的命名格式是 xxx-spring-boot-starter ,例如:

    2024年03月15日
    浏览(39)
  • Spring Boot单元测试

    ❤️❤️❤️SSM专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️ Spring + Spring MVC + MyBatis_冷兮雪的博客-CSDN博客 Spring Boot 中进行单元测试是一个常见的做法,可以帮助你验证应用程序的各个组件是否按预期工作。所以我们有必要去学习一番! 单元测试

    2024年02月13日
    浏览(46)
  • 【Spring Boot】单元测试

    单元测试在日常项目开发中必不可少,Spring Boot提供了完善的单元测试框架和工具用于测试开发的应用。接下来介绍Spring Boot为单元测试提供了哪些支持,以及如何在Spring Boot项目中进行单元测试。 单元测试主要用于测试单个代码组件,以确保代码按预期方式工作。目前流行的

    2024年02月16日
    浏览(43)
  • Spring boot 集成单元测试

    1.引入依赖 2.  3.编写测试类

    2024年02月11日
    浏览(49)
  • 【Spring Boot】SpringBoot 单元测试

    单元测试(unit testing),是指对软件中的最⼩可测试单元进⾏检查和验证的过程就叫单元测试。 1、可以⾮常简单、直观、快速的测试某⼀个功能是否正确。 2、使⽤单元测试可以帮我们在打包的时候,发现⼀些问题,因为在打包之前,所以的单元测试必须通过,否则不能打包

    2024年02月07日
    浏览(51)
  • Spring Boot异常处理和单元测试

    SpringBoot默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。一旦程序中出现了异常 SpringBoot 会向/error 的 url 发送请求。在 springBoot 中提供了一个叫 BasicErrorController 来处理/error 请求,然后跳转到默认显示异常的页面来展示异常信息 如 果我 们 需 要 将 所

    2024年03月17日
    浏览(38)
  • Spring Boot 做单元测试,真心强悍!

    Spring Boot 提供了丰富的测试功能,主要由以下两个模块组成: spring-boot-test :提供测试核心功能。 spring-boot-test-autoconfigure :提供对测试的自动配置。 Spring Boot 提供了一个  spring-boot-starter-test 一站式启动器,如以下依赖配置所示。 测试启动器依赖不仅包含以上两个 Spring Bo

    2024年02月04日
    浏览(44)
  • Spring Boot单元测试入门指南

    JUnit是一个成熟和广泛应用的Java单元测试框架,它提供了丰富的功能和灵活的扩展机制,可以帮助开发人员编写高质量的单元测试。通过JUnit,开发人员可以更加自信地进行重构、维护和改进代码,同时提高代码质量和可维护性。 在使用Spring Boot进行单元测试时,以下是一些

    2024年02月15日
    浏览(42)
  • 三个要点,掌握Spring Boot单元测试

    单元测试是软件开发中不可或缺的重要环节,它用于验证软件中最小可测试单元的准确性。 结合运用Spring Boot、JUnit、Mockito和分层架构,开发人员可以更便捷地编写可靠、可测试且高质量的单元测试代码,确保软件的正确性和质量。 本文将从与单元测试相关的技术主题开始,

    2024年02月08日
    浏览(43)
  • Spring Boot 单元测试 0基础教程

    咱们以一种通俗易懂的方式,通过一个简单的实例来教你怎么在Spring Boot项目中进行单元测试。 假设你有一个简单的Spring Boot应用,里面有一个UserService接口,以及它的实现类 UserServiceImpl,这个服务有一个方法用来获取用户的问候语。 为了对该方法进行单元测试,我们可以创

    2024年04月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包